5f417fbe9d
EN: 1.3.0.69 CN: 1.3.0.70 JP: 1.3.0.72 KR: 1.3.0.76
705 lines
25 KiB
Lua
705 lines
25 KiB
Lua
local NpcOptionCtrl = class("NpcOptionCtrl", BaseCtrl)
|
|
local Path = require("path")
|
|
local Offset = CS.Actor2DOffsetData
|
|
local GameResourceLoader = require("Game.Common.Resource.GameResourceLoader")
|
|
local ResTypeAny = GameResourceLoader.ResType.Any
|
|
local ResType = GameResourceLoader.ResType
|
|
local WwiseAudioMgr = CS.WwiseAudioManager.Instance
|
|
local GamepadUIManager = require("GameCore.Module.GamepadUIManager")
|
|
NpcOptionCtrl._mapNodeConfig = {
|
|
goBlur = {sNodeName = "blurBg"},
|
|
imgMask = {},
|
|
goContent = {
|
|
sNodeName = "----SafeAreaRoot----"
|
|
},
|
|
TMPChoose = {nCount = 4, sComponentName = "TMP_Text"},
|
|
TMPChooseDisable = {nCount = 4, sComponentName = "TMP_Text"},
|
|
TMPFuncDisable = {nCount = 4, sComponentName = "TMP_Text"},
|
|
TMPFunc = {nCount = 4, sComponentName = "TMP_Text"},
|
|
TMP_Title = {sComponentName = "TMP_Text"},
|
|
imgBgDisable = {nCount = 4},
|
|
imgIconLeave = {nCount = 4},
|
|
imgIconEnable = {nCount = 4},
|
|
rtChoice = {nCount = 4, sNodeName = "rtChoose"},
|
|
btnChoose = {
|
|
nCount = 4,
|
|
sComponentName = "NaviButton",
|
|
callback = "OnBtnClick_Select"
|
|
},
|
|
Select = {nCount = 4},
|
|
imgBody = {sComponentName = "Image"},
|
|
imgFace = {sComponentName = "Image"},
|
|
imgFunc = {nCount = 4},
|
|
rtCharacter = {},
|
|
rtPanel = {},
|
|
rtSelect = {},
|
|
canvasSelect = {
|
|
sNodeName = "rtSelectOption",
|
|
sComponentName = "Canvas"
|
|
},
|
|
rtTitle = {sComponentName = "Canvas"},
|
|
rtTalk = {},
|
|
imgTalkNameBg = {sComponentName = "Image"},
|
|
rubyTmp_Talk = {
|
|
sComponentName = "RubyTextMeshProUGUI"
|
|
},
|
|
txtName_Talk = {sComponentName = "TMP_Text"},
|
|
btnTalk = {
|
|
sComponentName = "Button",
|
|
callback = "OnBtnClick_Talk"
|
|
},
|
|
btnShortcutTalk = {
|
|
sComponentName = "NaviButton",
|
|
callback = "OnBtnClick_Talk"
|
|
},
|
|
animWaiting = {
|
|
sNodeName = "goWaitingAnim",
|
|
sComponentName = "Animator"
|
|
},
|
|
sv_Dialog_1L = {
|
|
sComponentName = "UIButton",
|
|
callback = "OnBtnClick_Talk"
|
|
},
|
|
ainPanel = {
|
|
sNodeName = "----SafeAreaRoot----",
|
|
sComponentName = "Animator"
|
|
},
|
|
TMPShowTitle = {sComponentName = "TMP_Text"},
|
|
ButtonBack = {
|
|
sComponentName = "NaviButton",
|
|
callback = "OnBtn_Close"
|
|
},
|
|
btnBag = {
|
|
sComponentName = "NaviButton",
|
|
callback = "OnBtn_Depot"
|
|
},
|
|
BtnBg = {},
|
|
imgCoinBg = {},
|
|
imgCoin = {sComponentName = "Image"},
|
|
txtCoinCount = {sComponentName = "TMP_Text"},
|
|
ActionBar = {
|
|
sCtrlName = "Game.UI.ActionBar.ActionBarCtrl"
|
|
},
|
|
goAllNoteList = {
|
|
sNodeName = "goNoteListBtn"
|
|
},
|
|
btnNoteDetail = {
|
|
sComponentName = "UIButton",
|
|
callback = "OnBtnClick_NoteDetail"
|
|
},
|
|
goNoteListBtn = {
|
|
sComponentName = "UIButton",
|
|
callback = "OnBtnClick_NoteDetail"
|
|
},
|
|
imgNote = {sComponentName = "Image", nCount = 9}
|
|
}
|
|
NpcOptionCtrl._mapEventConfig = {
|
|
RefreshStarTowerCoin = "OnEvent_SetCoin",
|
|
GamepadUIChange = "OnEvent_GamepadUIChange",
|
|
GamepadUIReopen = "OnEvent_Reopen"
|
|
}
|
|
NpcOptionCtrl._mapRedDotConfig = {}
|
|
function NpcOptionCtrl:Awake()
|
|
self.PanelOffset = Vector3.zero
|
|
self.tbGamepadUINode = self:GetGamepadUINode()
|
|
self.nCoin = 0
|
|
self:SetSprite_Coin(self._mapNode.imgCoin, AllEnum.CoinItemId.FixedRogCurrency)
|
|
NovaAPI.SetTMPText(self._mapNode.txtCoinCount, self.nCoin)
|
|
end
|
|
function NpcOptionCtrl:FadeIn()
|
|
end
|
|
function NpcOptionCtrl:FadeOut()
|
|
end
|
|
function NpcOptionCtrl:OnEnable()
|
|
self.bShowNote = false
|
|
self._mapNode.goAllNoteList.gameObject:SetActive(false)
|
|
self.nSelectIdx = 0
|
|
self.nNoteEventId = 0
|
|
self._mapNode.rtPanel.transform.localPosition = self.PanelOffset
|
|
PanelManager.InputDisable()
|
|
EventManager.Hit("StarTowerSetButtonEnable", false, false)
|
|
GamepadUIManager.EnableGamepadUI("NpcOptionCtrl", self.tbGamepadUINode)
|
|
local canvas = self.gameObject:GetComponent("Canvas")
|
|
local nInitSortingOrder = NovaAPI.GetCanvasSortingOrder(canvas)
|
|
NovaAPI.SetCanvasSortingOrder(self._mapNode.canvasSelect, nInitSortingOrder + 10)
|
|
local nId = CS.UnityEngine.SortingLayer.NameToID(AllEnum.SortingLayerName.UI)
|
|
NovaAPI.SetCanvasSortingId(self._mapNode.canvasSelect, nId)
|
|
NovaAPI.SetCanvasSortingId(self._mapNode.rtTitle, nId)
|
|
NovaAPI.SetCanvasSortingOrder(self._mapNode.rtTitle, nInitSortingOrder + 10)
|
|
local tbParams = self:GetPanelParam()
|
|
if type(tbParams) == "table" then
|
|
self.nType = tbParams[1]
|
|
local nEventId = tbParams[2]
|
|
local tbNpcOption = tbParams[3]
|
|
local nNpcSkinId = tbParams[4]
|
|
self.callback = tbParams[5]
|
|
self.bUnabledIdx = tbParams[6]
|
|
local tableEventId = tbParams[7]
|
|
local nTalkId = tbParams[8]
|
|
self.nEventAction = tbParams[9]
|
|
self.bOnlyTalk = tbParams[10]
|
|
self.bSweep = tbParams[11]
|
|
self.nCoin = tbParams[12]
|
|
self.nStarTowerId = tbParams[13]
|
|
self.tbNote = tbParams[14]
|
|
NovaAPI.SetTMPText(self._mapNode.txtCoinCount, self:ThousandsNumber(self.nCoin))
|
|
self._mapNode.imgMask.gameObject:SetActive(false)
|
|
self._mapNode.goContent.gameObject:SetActive(false)
|
|
self._mapNode.goBlur.gameObject:SetActive(true)
|
|
canvas.enabled = false
|
|
local wait = function()
|
|
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
|
|
NovaAPI.UIEffectSnapShotCapture(self._mapNode.goSnapShot)
|
|
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
|
|
canvas.enabled = true
|
|
self._mapNode.imgMask.gameObject:SetActive(true)
|
|
self._mapNode.goContent.gameObject:SetActive(true)
|
|
if self.bOnlyTalk then
|
|
self:RefreshTalkOnly(nNpcSkinId, nTalkId)
|
|
elseif self.nType == 1 then
|
|
self:Refresh(nEventId, tableEventId, tbNpcOption, self.bUnabledIdx, nNpcSkinId, nTalkId, self.nEventAction)
|
|
else
|
|
self:RefreshHighDanger(nEventId, nNpcSkinId, nTalkId)
|
|
end
|
|
end
|
|
cs_coroutine.start(wait)
|
|
end
|
|
self.handler = {}
|
|
for k, v in ipairs(self._mapNode.btnChoose) do
|
|
self.handler[k] = ui_handler(self, self.OnBtnSelect_Select, v, k)
|
|
v.onSelect:AddListener(self.handler[k])
|
|
end
|
|
end
|
|
function NpcOptionCtrl:Refresh(nCaseId, nEventId, tbNpcOption, tbUnselect, nNpcSkinId, nTalkId, nActionId)
|
|
local mapTalkData
|
|
if 0 < nTalkId then
|
|
mapTalkData = ConfigTable.GetData("StarTowerTalk", nTalkId)
|
|
end
|
|
for i = 1, 4 do
|
|
self._mapNode.imgFunc[i]:SetActive(true)
|
|
end
|
|
local sFace = "002"
|
|
if mapTalkData ~= nil then
|
|
sFace = mapTalkData.Face
|
|
local _b, _color = ColorUtility.TryParseHtmlString(mapTalkData.Color)
|
|
NovaAPI.SetImageColor(self._mapNode.imgTalkNameBg, _color)
|
|
NovaAPI.SetTMPText(self._mapNode.txtName_Talk, mapTalkData.Name)
|
|
NovaAPI.SetText_RubyTMP(self._mapNode.rubyTmp_Talk, mapTalkData.Content)
|
|
self._mapNode.ainPanel:Play("NpcOptionTalk_in")
|
|
WwiseAudioMgr:WwiseVoice_PlayInAVG(mapTalkData.Voice)
|
|
WwiseAudioMgr:PlaySound("ui_roguelike_event_enter")
|
|
self._mapNode.BtnBg:SetActive(false)
|
|
self:SetCoinActive(false)
|
|
self:SelectTalk()
|
|
else
|
|
if self.nType == 1 then
|
|
self._mapNode.ainPanel:Play("NpcOptionSelect_in")
|
|
else
|
|
self._mapNode.ainPanel:Play("NpcOptionSelectRed_in")
|
|
end
|
|
WwiseAudioMgr:PlaySound("ui_roguelike_event_dialog")
|
|
self._mapNode.BtnBg:SetActive(true)
|
|
self:SetCoinActive(true)
|
|
end
|
|
self.nNoteEventId = nEventId
|
|
self.nEventId = nCaseId
|
|
if tbNpcOption == nil then
|
|
printError("Npc事件为空")
|
|
local wait = function()
|
|
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
|
|
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
|
|
EventManager.Hit(EventId.ClosePanel, PanelId.NpcOptionPanel)
|
|
end
|
|
cs_coroutine.start(wait)
|
|
return
|
|
end
|
|
local tbBtnObj = {}
|
|
local bFirst = true
|
|
local mapEventAction
|
|
self._mapNode.TMPShowTitle:SetText("")
|
|
if nActionId ~= 0 then
|
|
mapEventAction = ConfigTable.GetData("StarTowerEventAction", nActionId)
|
|
if mapEventAction ~= nil then
|
|
self._mapNode.TMPShowTitle:SetText(mapEventAction.Desc)
|
|
end
|
|
end
|
|
for i = 1, 4 do
|
|
self._mapNode.TMPChoose[i]:SetText("")
|
|
self._mapNode.TMPChooseDisable[i]:SetText("")
|
|
if tbNpcOption[i] ~= nil then
|
|
local mapResultCfgData = ConfigTable.GetData("EventOptions", tbNpcOption[i])
|
|
if mapResultCfgData == nil then
|
|
printError("ResultCfgData Missing:" .. tbNpcOption[i])
|
|
self._mapNode.rtChoice[i]:SetActive(false)
|
|
else
|
|
if mapEventAction ~= nil then
|
|
local nOptionActionId = tbNpcOption[i] * 10000 + mapEventAction.Group
|
|
local mapOptionAction = ConfigTable.GetData("StarTowerEventOptionAction", nOptionActionId)
|
|
if mapOptionAction ~= nil then
|
|
self._mapNode.TMPChoose[i]:SetText(mapOptionAction.Desc)
|
|
self._mapNode.TMPChooseDisable[i]:SetText(mapOptionAction.Desc)
|
|
end
|
|
end
|
|
self._mapNode.TMPFunc[i]:SetText(mapResultCfgData.Desc)
|
|
self._mapNode.TMPFuncDisable[i]:SetText(mapResultCfgData.Desc)
|
|
if 0 < table.indexof(tbUnselect, i - 1) then
|
|
self._mapNode.imgBgDisable[i]:SetActive(true)
|
|
self._mapNode.btnChoose[i].interactable = false
|
|
else
|
|
self._mapNode.imgBgDisable[i]:SetActive(false)
|
|
self._mapNode.btnChoose[i].interactable = true
|
|
if bFirst then
|
|
bFirst = false
|
|
self.nSelectIdx = i
|
|
end
|
|
table.insert(tbBtnObj, self._mapNode.btnChoose[i])
|
|
end
|
|
self._mapNode.imgIconLeave[i]:SetActive(mapResultCfgData.IgnoreInterActive)
|
|
self._mapNode.imgIconEnable[i]:SetActive(not mapResultCfgData.IgnoreInterActive)
|
|
self._mapNode.rtChoice[i]:SetActive(true)
|
|
self._mapNode.Select[i]:SetActive(false)
|
|
end
|
|
else
|
|
self._mapNode.rtChoice[i]:SetActive(false)
|
|
end
|
|
end
|
|
GamepadUIManager.SetNavigation(tbBtnObj, false)
|
|
if mapTalkData == nil then
|
|
self:SelectChoose()
|
|
end
|
|
local GetName = function(sPortrait, Face)
|
|
local sFileFullName = Path.basename(sPortrait)
|
|
local sFileExtName = Path.extension(sPortrait)
|
|
local sFileName = string.gsub(sFileFullName, sFileExtName, "")
|
|
sFileName = string.gsub(sFileName, "_a", "")
|
|
local sBodyName = string.format("%s_%s", sFileName, "001")
|
|
local sFaceName = string.format("%s_%s", sFileName, Face)
|
|
return sBodyName, sFaceName
|
|
end
|
|
local GetSprite = function(sPortrait, sName)
|
|
local _sPath = string.format("%s/atlas_png/a/%s.png", Path.dirname(sPortrait), sName)
|
|
return self:LoadAsset(_sPath, typeof(Sprite))
|
|
end
|
|
local mapSkinData = ConfigTable.GetData("NPCSkin", nNpcSkinId)
|
|
if mapSkinData == nil then
|
|
return
|
|
end
|
|
local sAssetPath = mapSkinData.Portrait
|
|
local sBodyName, sFaceName = GetName(sAssetPath, sFace)
|
|
NovaAPI.SetImageSpriteAsset(self._mapNode.imgBody, GetSprite(sAssetPath, sBodyName))
|
|
NovaAPI.SetImageSpriteAsset(self._mapNode.imgFace, GetSprite(sAssetPath, sFaceName))
|
|
local Actor2DManager = require("Game.Actor2D.Actor2DManager")
|
|
local offsetAsset = self:LoadOffset(mapSkinData.Offset)
|
|
local mapOffset = Actor2DManager.GetMapPanelConfig(PanelId.NpcOptionPanel)
|
|
local finalReuse = mapOffset.nReuse
|
|
local s, x, y = offsetAsset:GetOffsetData(finalReuse, 1, true, 0, 0)
|
|
local v3Pos = Vector3(x * 100, y * 100, 0)
|
|
local v3Scale = Vector3(s, s, 1)
|
|
self._mapNode.rtCharacter.transform.localPosition = v3Pos
|
|
self._mapNode.rtCharacter.transform.localScale = v3Scale
|
|
if mapEventAction ~= nil then
|
|
self._mapNode.TMP_Title.gameObject:SetActive(true)
|
|
NovaAPI.SetTMPText(self._mapNode.TMP_Title, mapEventAction.Desc)
|
|
else
|
|
self._mapNode.TMP_Title.gameObject:SetActive(false)
|
|
end
|
|
end
|
|
function NpcOptionCtrl:RefreshHighDanger(nEventId, nNpcSkinId, nTalkId)
|
|
self.nEventId = nEventId
|
|
self.nSelectIdx = 1
|
|
local mapTalkData = ConfigTable.GetData("StarTowerTalk", nTalkId)
|
|
local sFace = "002"
|
|
if mapTalkData ~= nil then
|
|
sFace = mapTalkData.Face
|
|
local _b, _color = ColorUtility.TryParseHtmlString(mapTalkData.Color)
|
|
NovaAPI.SetImageColor(self._mapNode.imgTalkNameBg, _color)
|
|
NovaAPI.SetTMPText(self._mapNode.txtName_Talk, mapTalkData.Name)
|
|
NovaAPI.SetText_RubyTMP(self._mapNode.rubyTmp_Talk, mapTalkData.Content)
|
|
self._mapNode.ainPanel:Play("NpcOptionTalk_in")
|
|
WwiseAudioMgr:PlaySound("ui_roguelike_event_enter")
|
|
self._mapNode.BtnBg:SetActive(false)
|
|
self:SetCoinActive(false)
|
|
self:SelectTalk()
|
|
else
|
|
if self.nType == 1 then
|
|
self._mapNode.ainPanel:Play("NpcOptionSelect_in")
|
|
else
|
|
self._mapNode.ainPanel:Play("NpcOptionSelectRed_in")
|
|
end
|
|
WwiseAudioMgr:PlaySound("ui_roguelike_event_dialog")
|
|
self._mapNode.BtnBg:SetActive(true)
|
|
self:SetCoinActive(true)
|
|
self:SelectChoose()
|
|
end
|
|
for i = 1, 4 do
|
|
self._mapNode.imgFunc[i]:SetActive(false)
|
|
end
|
|
self._mapNode.rtChoice[1]:SetActive(true)
|
|
self._mapNode.rtChoice[2]:SetActive(true)
|
|
self._mapNode.rtChoice[3]:SetActive(false)
|
|
self._mapNode.rtChoice[4]:SetActive(false)
|
|
self._mapNode.TMPChoose[1]:SetText(ConfigTable.GetUIText("StarTower_Npc_EnterHighDanger"))
|
|
self._mapNode.imgBgDisable[1]:SetActive(false)
|
|
self._mapNode.imgIconLeave[1]:SetActive(false)
|
|
self._mapNode.imgIconEnable[1]:SetActive(true)
|
|
self._mapNode.TMPChoose[2]:SetText(ConfigTable.GetUIText("StarTower_Npc_Leave"))
|
|
self._mapNode.imgBgDisable[2]:SetActive(false)
|
|
self._mapNode.imgIconLeave[2]:SetActive(true)
|
|
self._mapNode.imgIconEnable[2]:SetActive(false)
|
|
for i = 1, 4 do
|
|
self._mapNode.Select[i]:SetActive(false)
|
|
end
|
|
GamepadUIManager.SetNavigation({
|
|
self._mapNode.btnChoose[1],
|
|
self._mapNode.btnChoose[2]
|
|
}, false)
|
|
local GetName = function(sPortrait, Face)
|
|
local sFileFullName = Path.basename(sPortrait)
|
|
local sFileExtName = Path.extension(sPortrait)
|
|
local sFileName = string.gsub(sFileFullName, sFileExtName, "")
|
|
sFileName = string.gsub(sFileName, "_a", "")
|
|
local sBodyName = string.format("%s_%s", sFileName, "001")
|
|
local sFaceName = string.format("%s_%s", sFileName, Face)
|
|
return sBodyName, sFaceName
|
|
end
|
|
local GetSprite = function(sPortrait, sName)
|
|
local _sPath = string.format("%s/atlas_png/a/%s.png", Path.dirname(sPortrait), sName)
|
|
return self:LoadAsset(_sPath, typeof(Sprite))
|
|
end
|
|
local mapSkinData = ConfigTable.GetData("NPCSkin", nNpcSkinId)
|
|
if mapSkinData == nil then
|
|
return
|
|
end
|
|
local sAssetPath = mapSkinData.Portrait
|
|
local sBodyName, sFaceName = GetName(sAssetPath, sFace)
|
|
NovaAPI.SetImageSpriteAsset(self._mapNode.imgBody, GetSprite(sAssetPath, sBodyName))
|
|
NovaAPI.SetImageSpriteAsset(self._mapNode.imgFace, GetSprite(sAssetPath, sFaceName))
|
|
local Actor2DManager = require("Game.Actor2D.Actor2DManager")
|
|
local offsetAsset = self:LoadOffset(mapSkinData.Offset)
|
|
local mapOffset = Actor2DManager.GetMapPanelConfig(PanelId.NpcOptionPanel)
|
|
local finalReuse = mapOffset.nReuse
|
|
local s, x, y = offsetAsset:GetOffsetData(finalReuse, 1, true, 0, 0)
|
|
local v3Pos = Vector3(x * 100, y * 100, 0)
|
|
local v3Scale = Vector3(s, s, 1)
|
|
self._mapNode.rtCharacter.transform.localPosition = v3Pos
|
|
self._mapNode.rtCharacter.transform.localScale = v3Scale
|
|
self._mapNode.TMP_Title.gameObject:SetActive(true)
|
|
NovaAPI.SetTMPText(self._mapNode.TMP_Title, ConfigTable.GetUIText("StarTower_Npc_EnterHighDangerTitle"))
|
|
WwiseAudioMgr:PlaySound("ui_roguelike_event_enter")
|
|
end
|
|
function NpcOptionCtrl:RefreshTalkOnly(nNpcSkinId, nTalkId)
|
|
local mapTalkData = ConfigTable.GetData("StarTowerTalk", nTalkId)
|
|
local sFace = "002"
|
|
if mapTalkData ~= nil then
|
|
sFace = mapTalkData.Face
|
|
local _b, _color = ColorUtility.TryParseHtmlString(mapTalkData.Color)
|
|
NovaAPI.SetImageColor(self._mapNode.imgTalkNameBg, _color)
|
|
NovaAPI.SetTMPText(self._mapNode.txtName_Talk, mapTalkData.Name)
|
|
NovaAPI.SetText_RubyTMP(self._mapNode.rubyTmp_Talk, mapTalkData.Content)
|
|
self._mapNode.ainPanel:Play("NpcOptionTalk_in")
|
|
WwiseAudioMgr:WwiseVoice_PlayInAVG(mapTalkData.Voice)
|
|
self._mapNode.BtnBg:SetActive(false)
|
|
self:SetCoinActive(false)
|
|
self:SelectTalk()
|
|
else
|
|
local wait = function()
|
|
printError("NPC Talk Data Missing:" .. nTalkId)
|
|
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
|
|
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
|
|
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
|
|
EventManager.Hit(EventId.ClosePanel, PanelId.NpcOptionPanel)
|
|
end
|
|
cs_coroutine.start(wait)
|
|
end
|
|
local GetName = function(sPortrait, Face)
|
|
local sFileFullName = Path.basename(sPortrait)
|
|
local sFileExtName = Path.extension(sPortrait)
|
|
local sFileName = string.gsub(sFileFullName, sFileExtName, "")
|
|
sFileName = string.gsub(sFileName, "_a", "")
|
|
local sBodyName = string.format("%s_%s", sFileName, "001")
|
|
local sFaceName = string.format("%s_%s", sFileName, Face)
|
|
return sBodyName, sFaceName
|
|
end
|
|
local GetSprite = function(sPortrait, sName)
|
|
local _sPath = string.format("%s/atlas_png/a/%s.png", Path.dirname(sPortrait), sName)
|
|
return self:LoadAsset(_sPath, typeof(Sprite))
|
|
end
|
|
local mapSkinData = ConfigTable.GetData("NPCSkin", nNpcSkinId)
|
|
if mapSkinData == nil then
|
|
return
|
|
end
|
|
local sAssetPath = mapSkinData.Portrait
|
|
local sBodyName, sFaceName = GetName(sAssetPath, sFace)
|
|
NovaAPI.SetImageSpriteAsset(self._mapNode.imgBody, GetSprite(sAssetPath, sBodyName))
|
|
NovaAPI.SetImageSpriteAsset(self._mapNode.imgFace, GetSprite(sAssetPath, sFaceName))
|
|
local Actor2DManager = require("Game.Actor2D.Actor2DManager")
|
|
local offsetAsset = self:LoadOffset(mapSkinData.Offset)
|
|
local mapOffset = Actor2DManager.GetMapPanelConfig(PanelId.NpcOptionPanel)
|
|
local finalReuse = mapOffset.nReuse
|
|
local s, x, y = offsetAsset:GetOffsetData(finalReuse, 1, true, 0, 0)
|
|
local v3Pos = Vector3(x * 100, y * 100, 0)
|
|
local v3Scale = Vector3(s, s, 1)
|
|
self._mapNode.rtCharacter.transform.localPosition = v3Pos
|
|
self._mapNode.rtCharacter.transform.localScale = v3Scale
|
|
WwiseAudioMgr:PlaySound("ui_roguelike_event_enter")
|
|
end
|
|
function NpcOptionCtrl:RefreshNoteList()
|
|
self.bShowNote = true
|
|
self._mapNode.goAllNoteList:SetActive(true)
|
|
local tbShowNote = {}
|
|
local mapCfg = ConfigTable.GetData("StarTower", self.nStarTowerId)
|
|
if mapCfg ~= nil then
|
|
local nDropGroup = mapCfg.SubNoteSkillDropGroupId
|
|
local tbNoteDrop = CacheTable.GetData("_SubNoteSkillDropGroup", nDropGroup)
|
|
if tbNoteDrop ~= nil then
|
|
for _, v in ipairs(tbNoteDrop) do
|
|
table.insert(tbShowNote, v.SubNoteSkillId)
|
|
end
|
|
end
|
|
end
|
|
table.sort(tbShowNote, function(a, b)
|
|
return a < b
|
|
end)
|
|
for k, v in ipairs(self._mapNode.imgNote) do
|
|
local nNoteId = tbShowNote[k]
|
|
v.gameObject:SetActive(nNoteId ~= nil)
|
|
if nNoteId ~= nil then
|
|
local mapNoteCfg = ConfigTable.GetData("SubNoteSkill", nNoteId)
|
|
if nil ~= mapNoteCfg then
|
|
self:SetPngSprite(v, mapNoteCfg.Icon .. AllEnum.DiscSkillIconSurfix.Small)
|
|
end
|
|
local tmpCount = v.gameObject.transform:Find("txtNoteCount"):GetComponent("TMP_Text")
|
|
NovaAPI.SetTMPText(tmpCount, self.tbNote[nNoteId] or 0)
|
|
end
|
|
end
|
|
end
|
|
function NpcOptionCtrl:SetCoinActive(bActive)
|
|
self._mapNode.imgCoinBg:SetActive(bActive)
|
|
end
|
|
function NpcOptionCtrl:OnDisable()
|
|
for k, v in ipairs(self._mapNode.btnChoose) do
|
|
v.onSelect:RemoveListener(self.handler[k])
|
|
end
|
|
end
|
|
function NpcOptionCtrl:OnDestroy()
|
|
EventManager.Hit("StarTowerSetButtonEnable", true, true)
|
|
end
|
|
function NpcOptionCtrl:OnRelease()
|
|
end
|
|
function NpcOptionCtrl:ClosePanel(bOnlyTalk, nSelectIdx, nEventId)
|
|
local callback = function()
|
|
GamepadUIManager.DisableGamepadUI("NpcOptionCtrl")
|
|
PanelManager.InputEnable()
|
|
if self.callback ~= nil and not bOnlyTalk then
|
|
self.callback(nSelectIdx, nEventId)
|
|
end
|
|
EventManager.Hit(EventId.ClosePanel, PanelId.NpcOptionPanel)
|
|
end
|
|
if bOnlyTalk then
|
|
self._mapNode.ainPanel:Play("NpcOptionTalk_out")
|
|
EventManager.Hit(EventId.TemporaryBlockInput, 0.4, callback)
|
|
else
|
|
if self.nType == 1 then
|
|
self._mapNode.ainPanel:Play("NpcOptionSelect_out")
|
|
else
|
|
self._mapNode.ainPanel:Play("NpcOptionSelectRed_out")
|
|
end
|
|
EventManager.Hit(EventId.TemporaryBlockInput, 0.5, callback)
|
|
end
|
|
end
|
|
function NpcOptionCtrl:OnBtn_Close()
|
|
local callback = function()
|
|
GamepadUIManager.DisableGamepadUI("NpcOptionCtrl")
|
|
PanelManager.InputEnable()
|
|
if self.bSweep and self.callback ~= nil then
|
|
self.callback(-1, -1, true)
|
|
end
|
|
EventManager.Hit(EventId.ClosePanel, PanelId.NpcOptionPanel)
|
|
end
|
|
if self.nType == 1 then
|
|
self._mapNode.ainPanel:Play("NpcOptionSelect_out")
|
|
else
|
|
self._mapNode.ainPanel:Play("NpcOptionSelectRed_out")
|
|
end
|
|
EventManager.Hit(EventId.TemporaryBlockInput, 0.5, callback)
|
|
end
|
|
function NpcOptionCtrl:OnBtn_Depot()
|
|
self.bOpenDepot = true
|
|
self.gameObject:SetActive(false)
|
|
local nTog = self.bShowNote and AllEnum.StarTowerDepotTog.DiscSkill or AllEnum.StarTowerDepotTog.Potential
|
|
EventManager.Hit(EventId.StarTowerDepot, nTog)
|
|
end
|
|
function NpcOptionCtrl:OnBtnClick_Select(btn)
|
|
local nIdx = table.indexof(self._mapNode.btnChoose, btn)
|
|
if table.indexof(self.bUnabledIdx, nIdx - 1) > 0 then
|
|
EventManager.Hit(EventId.OpenMessageBox, "不可选选项")
|
|
return
|
|
end
|
|
self:ClosePanel(false, nIdx, self.nEventId)
|
|
end
|
|
function NpcOptionCtrl:OnBtnSelect_Select(btn, nIndex)
|
|
if self.nSelectIdx == nIndex then
|
|
return
|
|
end
|
|
for k, v in ipairs(self._mapNode.Select) do
|
|
if k == nIndex then
|
|
if GamepadUIManager.GetCurUIType() ~= AllEnum.GamepadUIType.Other and GamepadUIManager.GetCurUIType() ~= AllEnum.GamepadUIType.Mouse then
|
|
v:SetActive(true)
|
|
else
|
|
v:SetActive(false)
|
|
end
|
|
elseif k == self.nSelectIdx then
|
|
v:SetActive(false)
|
|
end
|
|
end
|
|
self.nSelectIdx = nIndex
|
|
end
|
|
function NpcOptionCtrl:OnBtnClick_NoteDetail()
|
|
EventManager.Hit(EventId.OpenPanel, PanelId.NoteSkillInfo, self.tbNote)
|
|
end
|
|
function NpcOptionCtrl:OnBtnClick_Talk(btn)
|
|
self.bSelectTalk = false
|
|
if self.bOnlyTalk then
|
|
self:ClosePanel(true)
|
|
return
|
|
end
|
|
local nAnimLen = 0
|
|
if self.nType == 1 then
|
|
self._mapNode.ainPanel:Play("NpcOptionSelect_in")
|
|
nAnimLen = NovaAPI.GetAnimClipLength(self._mapNode.ainPanel, {
|
|
"NpcOptionSelect_in"
|
|
})
|
|
else
|
|
self._mapNode.ainPanel:Play("NpcOptionSelectRed_in")
|
|
nAnimLen = NovaAPI.GetAnimClipLength(self._mapNode.ainPanel, {
|
|
"NpcOptionSelectRed_in"
|
|
})
|
|
end
|
|
EventManager.Hit(EventId.TemporaryBlockInput, nAnimLen)
|
|
if self.nEventAction ~= 0 then
|
|
local mapEventAction = ConfigTable.GetData("StarTowerEventAction", self.nEventAction)
|
|
if mapEventAction ~= nil and mapEventAction.TrigVoice ~= "" then
|
|
WwiseAudioMgr:WwiseVoice_PlayInAVG(mapEventAction.TrigVoice)
|
|
end
|
|
end
|
|
WwiseAudioMgr:PlaySound("ui_roguelike_event_dialog")
|
|
self._mapNode.BtnBg:SetActive(true)
|
|
local mapEventCfg = ConfigTable.GetData("StarTowerEvent", self.nNoteEventId)
|
|
if mapEventCfg ~= nil and mapEventCfg.EventResType == GameEnum.towerEventResType.SubNoteSkill then
|
|
self:RefreshNoteList()
|
|
end
|
|
self:SetCoinActive(true)
|
|
self:SelectChoose()
|
|
end
|
|
function NpcOptionCtrl:LoadOffset(sPath)
|
|
return self:LoadAsset(sPath, typeof(Offset))
|
|
end
|
|
function NpcOptionCtrl:OnEvent_SetCoin(nCount)
|
|
if nCount then
|
|
if nCount > self.nCoin then
|
|
local twCoin = DOTween.To(function()
|
|
return self.nCoin
|
|
end, function(v)
|
|
NovaAPI.SetTMPText(self._mapNode.txtCoinCount, self:ThousandsNumber(math.floor(v)))
|
|
end, nCount, 1)
|
|
local _cb = function()
|
|
self.nCoin = nCount
|
|
end
|
|
twCoin.onComplete = dotween_callback_handler(self, _cb)
|
|
else
|
|
NovaAPI.SetTMPText(self._mapNode.txtCoinCount, self:ThousandsNumber(nCount))
|
|
self.nCoin = nCount
|
|
end
|
|
end
|
|
end
|
|
function NpcOptionCtrl:OnEvent_CloseStarTowerDepot()
|
|
if self.bOpenDepot then
|
|
self.bOpenDepot = false
|
|
local nSelect = self.nSelectIdx ~= 0 and self.nSelectIdx or 1
|
|
GamepadUIManager.SetSelectedUI(self._mapNode.btnChoose[nSelect].gameObject)
|
|
self.gameObject:SetActive(true)
|
|
if self.nType == 1 then
|
|
self._mapNode.ainPanel:Play("NpcOptionSelect_in")
|
|
else
|
|
self._mapNode.ainPanel:Play("NpcOptionSelectRed_in")
|
|
end
|
|
WwiseAudioMgr:PlaySound("ui_roguelike_event_dialog")
|
|
self._mapNode.BtnBg:SetActive(true)
|
|
self:SetCoinActive(true)
|
|
self:SelectChoose()
|
|
end
|
|
end
|
|
function NpcOptionCtrl:OnEvent_GamepadUIChange(sName, nBeforeType, nAfterType)
|
|
if sName ~= "NpcOptionCtrl" then
|
|
return
|
|
end
|
|
local bNeedSelect = nBeforeType == AllEnum.GamepadUIType.Other and nAfterType ~= AllEnum.GamepadUIType.Mouse or nBeforeType == AllEnum.GamepadUIType.Mouse and nAfterType ~= AllEnum.GamepadUIType.Other
|
|
if bNeedSelect then
|
|
if self.bSelectTalk then
|
|
GamepadUIManager.SetSelectedUI(self._mapNode.btnShortcutTalk.gameObject)
|
|
else
|
|
for k, v in ipairs(self._mapNode.btnChoose) do
|
|
if k == self.nSelectIdx then
|
|
self._mapNode.Select[k]:SetActive(true)
|
|
GamepadUIManager.SetSelectedUI(self._mapNode.btnChoose[self.nSelectIdx].gameObject)
|
|
end
|
|
end
|
|
end
|
|
else
|
|
for k, v in ipairs(self._mapNode.btnChoose) do
|
|
self._mapNode.Select[k]:SetActive(false)
|
|
end
|
|
end
|
|
end
|
|
function NpcOptionCtrl:OnEvent_Reopen(sName)
|
|
if sName ~= "NpcOptionCtrl" then
|
|
return
|
|
end
|
|
self:OnEvent_CloseStarTowerDepot()
|
|
end
|
|
function NpcOptionCtrl:SelectTalk()
|
|
local wait = function()
|
|
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
|
|
self._mapNode.animWaiting:SetTrigger("tManual")
|
|
end
|
|
cs_coroutine.start(wait)
|
|
local tbConfig = {
|
|
{
|
|
sAction = "Confirm",
|
|
sLang = "ActionBar_NextDialogue"
|
|
}
|
|
}
|
|
self._mapNode.ActionBar:InitActionBar(tbConfig)
|
|
self.bSelectTalk = true
|
|
GamepadUIManager.SetSelectedUI(self._mapNode.btnShortcutTalk.gameObject)
|
|
end
|
|
function NpcOptionCtrl:SelectChoose()
|
|
local tbConfig = {
|
|
{
|
|
sAction = "Confirm",
|
|
sLang = "ActionBar_Confirm"
|
|
},
|
|
{
|
|
sAction = "Depot",
|
|
sLang = "ActionBar_Depot"
|
|
},
|
|
{
|
|
sAction = "Back",
|
|
sLang = "ActionBar_Back"
|
|
}
|
|
}
|
|
self._mapNode.ActionBar:InitActionBar(tbConfig)
|
|
local nUIType = GamepadUIManager.GetCurUIType()
|
|
if nUIType ~= AllEnum.GamepadUIType.Other and nUIType ~= AllEnum.GamepadUIType.Mouse then
|
|
if self.nSelectIdx ~= 0 then
|
|
self._mapNode.Select[self.nSelectIdx]:SetActive(true)
|
|
GamepadUIManager.SetSelectedUI(self._mapNode.btnChoose[self.nSelectIdx].gameObject)
|
|
end
|
|
else
|
|
for k, v in ipairs(self._mapNode.btnChoose) do
|
|
self._mapNode.Select[k]:SetActive(false)
|
|
end
|
|
end
|
|
end
|
|
return NpcOptionCtrl
|