--- --- Created by 谌建军. --- DateTime: 2017/12/25 13:52 --- local PKPlayBackView = require('main.poker.PKPlayBackView') local EXPlayerCardInfoView = import('.EXPlayerPokerInfoView') local EXPlayerSelfCardInfoView = import('.EXPlayerSelfPokerInfoView') local PlayerInfoView = import('.EXPlayerInfoView') local EXRightPanelView = import(".EXRightPanelView") local EXResultView = import(".EXResultView") local EXCardCheck = import(".CardCheck") local M = {} local EXRecord_Event = { Evt_OutCard = 'OutCard', Evt_Pass = 'pass', Evt_NewRound = 'newindex', Evt_result = 'result', Evt_Result = 'Result', Evt_Opt = 'prompt' } local default_bg = 1 local bg_config = { { id = 1, url = 'extend/poker/duoduo/bg/bg1', thumb = 'ui://Extend_Poker_DuoDuo/table_bg1' }, { id = 2, url = 'extend/poker/duoduo/bg/bg2', thumb = 'ui://Extend_Poker_DuoDuo/table_bg2' }, { id = 3, url = 'extend/poker/duoduo/bg/bg3', thumb = 'ui://Extend_Poker_DuoDuo/table_bg3' } } --- Create a new function M.new() setmetatable(M, { __index = PKPlayBackView }) local self = setmetatable({}, { __index = M }) self.class = 'EXPlayBackView' self:init() return self end function M:InitView(url) local room = self._room if not room.self_player then room.self_player = room:GetPlayerBySeat(1) end self._gamectr = ControllerManager.GetController(GameController) UIPackage.AddPackage('extend/poker/duoduo/ui/Extend_Poker_DuoDuo') PKPlayBackView.InitView(self, "ui://Extend_Poker_DuoDuo/EXMain_New_" .. room.room_config.people_num, default_bg, bg_config) self._tex_round = self._view:GetChild('round') self._player_card_info = {} local _player_card_info = self._player_card_info for i = 1, room.room_config.people_num do local tem = self._view:GetChild('player_card_info_' .. i) self._player_card_info[i] = self:NewPlayerPokerInfoView(tem, i) end local rightpanel = self._view:GetChild("right_panel") if self._rightPanelView ~= nil then self._rightPanelView:Destroy() end self._rightPanelView = EXRightPanelView.new(self, rightpanel) rightpanel:GetChild("btn_setting").onClick:Clear() self._player_info = {} local _player_info = self._player_info for i = 1, self._room.room_config.people_num do local tem = self._view:GetChild('player_info' .. i) _player_info[i] = PlayerInfoView.new(tem, self) end local list = self._room.player_list for i = 1, #list do local p = list[i] local info = _player_info[self:GetPos(p.seat)] info._view.visible = true info:FillData(p) end if self._room.hpOnOff == 1 and self._room.score_times ~= 1 then -- body self._view:GetChild('roominfo_panel1'):GetChild('tex_beishu').text = self._room.score_times .. '倍' else self._view:GetChild('roominfo_panel1'):GetChild('tex_beishu').text = '' end self._ctr_inClear = self._view:GetController('Inclear') self._cardCheck = EXCardCheck:InitFlag() self._gamectr._cardCheck = self._cardCheck self._eventmap = {} self._cmdmap = {} self._cmdmap[EXRecord_Event.Evt_OutCard] = self.CmdOutCard self._cmdmap[EXRecord_Event.Evt_Pass] = self.CmdPass self._cmdmap[EXRecord_Event.Evt_NewRound] = self.CmdNewRound self._cmdmap[EXRecord_Event.Evt_result] = self.Cmdresult self._cmdmap[EXRecord_Event.Evt_Opt] = self.CmdOpt end function M:NewPlayerPokerInfoView(view, index) if index == 1 then return EXPlayerSelfCardInfoView.new(view, self) end return EXPlayerCardInfoView.new(view, self) end function M:FillRoomData(data) -- print("hidezhanji 1111") self._currentStep = 1 local room = DataManager.CurrenRoom self._room = DataManager.CurrenRoom local _player_card_info = self._player_card_info local roominfo_panel = self._view:GetChild('roominfo_panel1') self._room.pai = 0 roominfo_panel:GetChild('tex_roomid').text = data.info.roomid roominfo_panel:GetChild('tex_gametype').text = room.room_config:GetGameName() for i = 1, #room.player_list do local p = room.player_list[i] local card_info = _player_card_info[self:GetPos(p.seat)] local head_info = self._player_info[self:GetPos(p.seat)] if p.total_hp then -- print("hidezhanji 2222") head_info._view:GetChild('zhanji').visible = false if room.hpOnOff == 1 or room:checkHpNonnegative() then head_info._view:GetChild('zhanji').visible = true head_info._view:GetChild('text_jifen').text = d2ad(p.total_hp) end end head_info:FillData(p) head_info:UnmarkTuoguan() head_info:UpdateScore() if p.seat ~= room.self_player.seat then card_info:UpdateHandPoker(p.hand_list, false, true) end head_info:UpdatePiao(p.piao) end self:UpdateRound(self._room.curren_round) self:GenerateAllStepData(data) self:ShowStep(1) self:Play() end function M:ChangePlayState(state) self._play = state self:ChangeTextSpeed() local btn_play = self._view:GetChild("panel_record"):GetChild("btn_play") if self._play then btn_play:GetController("state").selectedIndex = 1 else btn_play:GetController("state").selectedIndex = 0 end --开始时,隐藏显示结算界面 if state then if self.destory_win ~= nil then coroutine.stop(self.destory_win) end self.destory_win = nil if self.result_view then self.result_view._root_view:RemoveFromParent() self.result_view:Destroy() self._ctr_inClear.selectedIndex = 0 end self.result_view = nil end end function M:ShowStep(index) local step = self._step[index] if step == nil then return end for i = 1, #step.player_card_data do local p = self._room:GetPlayerBySeat(i) local info = self._player_card_info[self:GetPos(i)] p.hand_list = step.player_card_data[i].hand_list p.out_card_list = step.player_card_data[i].out_card_list p.hand_left_count = #p.hand_list if step.cmd == EXRecord_Event.Evt_Opt and step.seat == p.seat then info._view:GetController('out_card_option2').selectedIndex = 1 else info._view:GetController('out_card_option2').selectedIndex = 0 end if p.seat ~= self._room.self_player.seat then info:UpdateHandPoker(p.hand_list, false, true) else info:InitPoker(p.hand_list, false) end info:SetOutCardInfo(nil, false) end if step.cmd == EXRecord_Event.Evt_OutCard then local seat = step.current_out_seat local p = self._room:GetPlayerBySeat(seat) local info = self._player_card_info[self:GetPos(seat)] local card = step.out_card_list local card_list = self._gamectr:ChangeCodeByFrom(card, true) info:SetOutCardInfo(card_list, false) self:ClearNextSeatOutCard(seat) self._cardCheck:InitLastCard(card_list) self:_Effect(self._cardCheck.type, p) self:PlaySound(p.self_user.sex, self:GetSoundFileName(self._cardCheck.type, num, self:GetIsNewBout(seat) )) end if step.cmd == EXRecord_Event.Evt_Pass then local seat = step.current_out_seat local p = self._room:GetPlayerBySeat(seat) local info = self._player_card_info[self:GetPos(seat)] info:SetOutCardInfo(nil, true) self:ClearNextSeatOutCard(seat) end if step.cmd == EXRecord_Event.Evt_NewRound then for i = 1, #self._room.player_list do local p = self._room:GetPlayerBySeat(i) local card_info = self._player_card_info[self:GetPos(p.seat)] card_info:SetOutCardInfo(nil, false) end end if step.cmd == EXRecord_Event.Evt_result then local data = step.data local over = 0 local info = data.win.info local win_seat = data.win.winseat local remaincards = {} -- local energyTab = arg[5] local otherpoker_list = self._view:GetChild("otherpoker_list") local card_info = self._player_card_info[self:GetPos(self._room.self_player.seat)] if self.dismissWin ~= nil then self.dismissWin:Destroy() end self.dismissWin = nil if self.MypokerList ~= nil then -- body card_info:Clear() card_info:InitPoker(self.MypokerList, false) self.MypokerList = nil end if otherpoker_list ~= nil then -- body otherpoker_list:RemoveChildrenToPool() otherpoker_list.visible = true end if self.destory_win ~= nil then coroutine.stop(self.destory_win) end self.destory_win = nil self.destory_win = coroutine.start(function() if win_seat == self._room.self_player.seat then ViewUtil.PlaySound("DuoDuo_PK", "extend/poker/duoduo/sound/end_music.mp3") else ViewUtil.PlaySound("DuoDuo_PK", "extend/poker/duoduo/sound/lose_music.mp3") end coroutine.stop(self._leftClock_continue) for i = 1, #self._player_card_info do local card_info = self._player_card_info[i] card_info._ctr_time_clock.selectedIndex = 0 self._left_time = 0 end for i = 1, #info do local player = info[i] local p = self._room:GetPlayerBySeat(player.seat) local head_info = self._player_info[self:GetPos(player.seat)] head_info:SetBaoDan(false) head_info._view:GetChild('text_jifen').text = player.score head_info:PlayScore(player.winscore, win_seat == player.seat) end coroutine.wait(2) self.result_view = EXResultView.new(self, info, self._room.room_id, over, win_seat, 0, remaincards) self.result_view:SetDestroryCallback(function() for i = 1, #self._player_card_info do local card_info = self._player_card_info[i] card_info.ctr_outpoker.selectedIndex = 0 if card_info._ctr_resultOut then card_info._ctr_resultOut.selectedIndex = 0 end end end) self.result_view:Show() self.result_view._root_view:RemoveFromParent() self._view:AddChildAt(self.result_view._root_view, self._view:GetChildIndex(self._view:GetChild('mask_tips')) - 1) if self.WinItem_view ~= nil then self.WinItem_view:Dispose() self.WinItem_view = nil end if self.rank_view ~= nil then self.rank_view:Dispose() self.rank_view = nil end if self._room.self_player.entrust == true then local btn_confirm = self.result_view._view:GetChild("btn_confirm") btn_confirm.onClick:Call() end ViewUtil.PlaySound("DuoDuo_PK", "extend/poker/duoduo/sound/end_music.mp3") end) if over == 1 then -- body self:UnmarkSelfTuoguan() ControllerManager.ChangeController(LoddyController) end end if step.cmd == EXRecord_Event.Evt_Result then local Result = step.Result self.result_view = EXResultView.new(self._root_view, Result.info, self._room.room_id, Result.type, Result.winseat, 0, Result.remaincards) local num = self._view:GetChildIndex(self._view:GetChild("panel_record")) self._view:AddChildAt(self.result_view._view, num) else -- if self.result_view then -- self.result_view:Dispose() -- end end end function M:GenerateAllStepData(data) local cmdList = self.cmdList self._step = {} local step = {} local info = data.info step.cmd = '' step.win = 0 step.player_card_data = {} for i = 1, #self._room.player_list do local p = info.playerData[i] local u = {} u.seat = p.seat u.hand_list = p.hand_card u.hand_count = #u.hand_list u.out_card_list = {} step.player_card_data[u.seat] = u end self._step[#self._step + 1] = step for i = 1, #cmdList do local tem = cmdList[i] self._cmdmap[tem.cmd](self, tem, i) end end function M:CmdOutCard(cmd, index) local data = self:CopyLastStep(index) data.cmd = cmd.cmd data.current_out_seat = cmd.seat local u = data.player_card_data[cmd.seat] u.card_list = cmd.data.card data.out_card_list = cmd.data.card_list for i = 1, #data.out_card_list do local out_card = data.out_card_list[i] for j = 1, #u.hand_list do if u.hand_list[j] == out_card then list_remove(u.hand_list, out_card) break end end end end function M:CmdNewRound(cmd, index) local data = self:CopyLastStep(index) data.cmd = cmd.cmd end function M:CmdPass(cmd, index) local data = self:CopyLastStep(index) data.cmd = cmd.cmd data.current_out_seat = cmd.seat end function M:Cmdresult(cmd, index) local data = self:CopyLastStep(index) data.cmd = cmd.cmd data.data = cmd.data end function M:CmdResult(cmd, index) local data = self:CopyLastStep(index) data.cmd = cmd.cmd data.Result = cmd.data for i = 1, #data.Result.info do local p = data.Result.info[i] p.nick = self._room:GetPlayerBySeat(p.seat).self_user.nick_name end end function M:CmdOpt(cmd, index) local data = self:CopyLastStep(index) data.cmd = cmd.cmd data.seat = cmd.seat end function M:CopyLastStep(index) local step = {} local last_step = self._step[index] step = membe_clone(last_step) step.player_card_data = {} local card_data = step.player_card_data for i = 1, #last_step.player_card_data do card_data[i] = {} card_data[i].hand_list = membe_clone(last_step.player_card_data[i].hand_list) card_data[i].out_card_list = membe_clone(last_step.player_card_data[i].out_card_list) end step.Result = nil self._step[#self._step + 1] = step return step end function M:ClearNextSeatOutCard(currenOutCardSeat) local people_num = self._room.room_config.people_num local next_seat = currenOutCardSeat + 1 if next_seat > people_num then next_seat = next_seat - people_num end local p = self._room:GetPlayerBySeat(next_seat) local card_info = self._player_card_info[self:GetPos(p.seat)] card_info:SetOutCardInfo(nil, false) end function M:UpdateRound(round) local total_round = self._room.room_config.Times -- self._text_round.text = string.format("%d / %d 局", round, total_round) if not self._text_currenRound then self._text_currenRound = self._view:GetChild('Text_CurrenRound') end if not self._text_maxRound then self._text_maxRound = self._view:GetChild('Text_MaxMaxRound') end self._text_currenRound.text = round self._text_maxRound.text = string.format("/%s局", total_round) end function M:NextRecordPlay() self._totalRound = tonumber(self._totalRound) local result = PlayBackView.NextRecordPlay(self) if not result then return end self:ChangePlayState(false) self._speed = 1 self._playFoward = true self:ChangeTextSpeed() -- if self.result_view then -- self.result_view:Dispose() -- self.result_view = nil -- end end function M:LastRecordPlay() local result = PlayBackView.LastRecordPlay(self) if not result then return end self:ChangePlayState(false) self._speed = 1 self._playFoward = true self:ChangeTextSpeed() -- if self.result_view then -- self.result_view:Dispose() -- self.result_view = nil -- end end function M:_Effect(type1, player) if type1 == 1 or type1 == 3 or type1 == 7 then self._popEvent = true return end local info = self._player_card_info[self:GetPos(player.seat)] info:PlayEffect(type1, function() self._popEvent = true end) end function M:GetSoundFileName(type, num, isNewBout) local fileName if type == 1 or type == 3 or type == 7 then local num = self._cardCheck.lastMinCard if type == 1 then fileName = string.format("1_%d", num) elseif type == 3 then fileName = string.format("2_%d", num) elseif type == 7 then fileName = string.format("3_%d", num) end else if not isNewBout and type ~= 6 then local r = math.random(1, 3) fileName = "dani_" .. r else if type == 8 or type == 12 then fileName = 5 else fileName = type end end end return fileName end function M:PlaySound(sex, path) local sex_path = ViewUtil.Sex_Chat[sex] -- 1 男 2 女 local sound_path = string.format("extend/poker/duoduo/sound/%s/%s.mp3", sex_path, path) ViewUtil.PlaySound("DuoDuo_PK", sound_path) end function M:GetIsNewBout(seat) local passCount = 0 for i = 1, #self._room.player_list do local player = self._room.player_list[i] if seat ~= player.seat then local isPass = self:GetIsPass(player.out_card_list) if isPass then passCount = passCount + 1 end end end if passCount == self._room.room_config.people_num - 1 then return true else return false end end function M:GetIsPass(cardlist) if #cardlist == 0 then return true end if cardlist[1] ~= nil and cardlist[1] == 0 then return true end return false end function M:OnUpdate() if self._play then if (self._currentStep == #self.cmdList + 1 and self._playFoward) then self:ChangePlayState(false) ViewUtil.ErrorTip(nil, '当前已是录像结尾了,再次点击播放按钮可重新播放') return elseif (self._currentStep == 0 and not self._playFoward) then self:ChangePlayState(false) ViewUtil.ErrorTip(nil, '当前已是录像开头了,再次点击播放按钮可重新播放') return end self._timer = self._timer + Time.deltaTime if self._timer >= 1 / self._speed then self._timer = 0 local step = self._playFoward and 1 or -1 self._currentStep = self._currentStep + step if self._currentStep > 0 then self:ShowStep(self._currentStep) end end end end function M:Destroy() UpdateBeat:Remove(self.OnUpdate, self) PlayBackView.Destroy(self) end return M