hengyang_client/lua_probject/extend_project/extend/majiang/jinxi/EXPlayBackView.lua

499 lines
18 KiB
Lua

local MJPlayBackView = require("main.majiang.MJPlayBackView")
local EXRoomConfig = import(".EXRoomConfig")
local EXClearingView = import(".EXClearingView")
local HuCardImg = import(".HuCardImg")
local Record_Event = import(".RecordEvent")
local M = {}
--- Create a new
function M.new()
setmetatable(M, { __index = MJPlayBackView })
local self = setmetatable({}, { __index = M })
self.class = "PlayBackView"
self:init()
return self
end
function M:InitView(url)
local room = self._room
UIPackage.AddPackage("extend/majiang/jinxi/ui/Extend_MJ_JinXi")
MJPlayBackView.InitView(self, string.format("ui://Main_Majiang/Main_new_%d_jiangxi", room.room_config.people_num))
local _cardbox = self._view:GetChild("cardbox")
--self._view:GetChild("panel_record"):GetChild("btn_LastStep").enabled = false
self._ctr_cardbox = _cardbox:GetController("c1")
self._tex_round = self._view:GetChild("tex_round")
self._tex_LeftCard = self._view:GetChild("remaining_card")
self._anchor = self._view:GetChild("mask_tips")
self.HuCardImg = setmetatable(HuCardImg, { __index = self.HuCardImg })
self.asset_group = "JinXi_MJ"
self.HuCardImg_path = "ui://Extend_MJ_JinXi/"
self.Sound_path = "extend/majiang/jinxi/sound/"
self._eventmap = {}
self._cmdmap = {}
self._cmdmap[Record_Event.Evt_GetCard] = self.CmdGetCard
self._cmdmap[Record_Event.Evt_OutCard] = self.CmdOutCard
self._cmdmap[Record_Event.Evt_Action] = self.CmdAction
self._cmdmap[Record_Event.Evt_Win] = self.CmdWin
self._cmdmap[Record_Event.Evt_Niao] = self.CmdNiao
self._cmdmap[Record_Event.Evt_Piao] = self.CmdPiao
self._cmdmap[Record_Event.Evt_Result] = self.CmdResult
self.com_logocType.selectedIndex = 3
end
function M:FillRoomData(data)
MJPlayBackView.FillRoomData(self)
if self._win_pic then self._win_pic:Dispose() end
if self._niao then self._niao:Dispose() end
self._currentStep = 0
local room = DataManager.CurrenRoom
local _player_card_info = self._player_card_info
local left_count = data.info.left_card
self:UpdateLeftCard(left_count)
local round = data.info.round
self:UpdateRound(round)
local roominfo_panel = self._view:GetChild("roominfo_panel1")
roominfo_panel:GetChild("tex_roomid").text = room.room_id
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)]
card_info:Clear()
table.sort(p.card_list, self.HandCardSortAndJing)
card_info:UpdateHandCard(false, true)
self._player_info[i]._view:GetController("piao_niao").selectedIndex = 0
end
self:GenerateAllStepData(data)
self:UpdateStep(1)
self:Play()
-- self:ShowStep(0)
end
function M:ShowStep(index)
local step = self._step[index + 1]
self:UpdateLeftCard(step.left_card)
-- self._ctr_cardbox.selectedIndex = step.current_out_seat
self:UpdateCardBox(self:GetPos(step.current_out_seat))
self:UpdateStep(index + 1)
if step.cmd ~= Record_Event.Evt_OutCard then
self:RemoveCursor()
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.card_list = step.player_card_data[i].card_list
p.outcard_list = step.player_card_data[i].outcard_list
p.fz_list = step.player_card_data[i].fz_list
p.hand_left_count = #p.card_list
info:Clear()
info:ResetFzList()
p.piao_niao = step.player_card_data[i].piao_niao
local head_info = self._player_info[self:GetPos(i)]
if p.piao_niao and p.piao_niao > 0 then
head_info._view:GetChild("mask_piao").title = "飘分 " .. p.piao_niao
head_info._view:GetController("piao_niao").selectedIndex = 1
else
head_info._view:GetController("piao_niao").selectedIndex = 0
end
if step.cmd == Record_Event.Evt_OutCard and i == step.last_out_seat then
local card = p.outcard_list[#p.outcard_list]
info:UpdateOutCardList(nil, card, self._cursor)
self:PlayMJSound("chupai.mp3")
self:PlaySound("JinXi_MJ", p.self_user.sex, tostring(card))
else
info:UpdateOutCardList()
end
if (step.cmd == Record_Event.Evt_GetCard or step.cmd == Record_Event.Evt_Action) and p.seat == step.current_out_seat then
info:UpdateHandCard(true, true)
if step.cmd == Record_Event.Evt_Action then
pt("lingmeng step ", step)
local fz = step.fz
local info = self._player_card_info[self:GetPos(i)]
local loader_HuEffect = info._viewClip_Peng_Gang
local effects = ""
if fz.type == FZType.Peng then
self:PlaySound("Main_Majiang", p.self_user.sex, "peng")
effects = "clip_peng"
elseif fz.type == FZType.Chi then
else
self:PlaySound("Main_Majiang", p.self_user.sex, "gang")
effects = "clip_gang"
end
local clip = UIPackage.CreateObjectFromURL(string.format("ui://Main_Majiang/%s", effects))
clip:SetSize(loader_HuEffect.width, loader_HuEffect.height)
loader_HuEffect:AddChild(clip)
clip:SetPlaySettings(0, -1, 1, -1)
clip.onPlayEnd:Add(function()
if clip.parent then
clip.parent:RemoveChild(clip)
end
clip:Dispose()
end)
clip.playing = true
coroutine.start(function()
coroutine.wait(0.3)
self._popEvent = true
end)
end
else
info:UpdateHandCard(false, true)
end
----多人胡的时候,同时显示胡
if step.cmd == Record_Event.Evt_Result then
--所有都显示胡吧,暂时没做胡和自摸的判断
if step.result_data.info_list[i].is_win then
local info2 = self._player_card_info[self:GetPos(step.result_data.info_list[i].seat)]
local loader_HuEffect = info2._viewLoader_selfHuCardEffect
local isZiMo = false
DataManager.CurrenRoom.isZiMoHu = isZiMo
local hu_sound = isZiMo and ("zimo") or ("hu")
printlog("声音====>>>", hu_sound)
self:PlaySound(self.asset_group, p.self_user.sex, hu_sound)
local effects = isZiMo and ("tile_zimo") or ("tile_hu")
loader_HuEffect.visible = true
loader_HuEffect.url = "ui://Main_Majiang/" .. effects
loader_HuEffect:SetScale(2, 2)
local hu_tween = loader_HuEffect:TweenScale(Vector2(1, 1), 0.3)
hu_tween:SetEase(EaseType.QuartOut)
hu_tween:OnComplete(function()
loader_HuEffect.visible = false
end)
end
end
end
if step.cmd == Record_Event.Evt_Win then
self._win_pic = UIPackage.CreateObjectFromURL("ui://Main_Majiang/胡")
local info = self._player_card_info[self:GetPos(step.win)]
info._view:AddChild(self._win_pic)
self._win_pic:Center()
else
if self._win_pic then
self._win_pic:Dispose()
end
end
if step.cmd == Record_Event.Evt_Niao then
local niao_list = step.niao
self._niao = UIPackage.CreateObjectFromURL("ui://Extend_MJ_JinXi/Panel_Birds")
local list = self._niao:GetChild("Lst_birds")
list:RemoveChildrenToPool()
for i = 1, #niao_list do
local item = list:AddItemFromPool()
item.icon = UIPackage.GetItemURL("Main_Majiang", "b201_" .. niao_list[i].card)
if niao_list[i].score > 0 then
item:GetController("bg").selectedIndex = 2
end
end
self._view:AddChild(self._niao)
self._view:AddChild(self._view:GetChild("panel_record"))
self._niao:Center()
else
if self._niao then
self._niao:Dispose()
end
end
if step.cmd == Record_Event.Evt_Result then
if not self.result then
local result = step.result_data
self.result = EXClearingView.new(self, { flag_back = true })
self.result:InitData(0, self._room, result)
self.result._view.x = (GRoot.inst.width - self.result._view.width) * -0.5
self.result._view.width = GRoot.inst.width
self.result._view.height = GRoot.inst.height
self._anchor:AddChild(self.result._view)
self.result._view.visible = false
self.result._view.x = self._anchor.x * -1
self.result._view.y = self._anchor.y * -1
local liuju = result and result.liuju or nil
coroutine.start(function()
coroutine.wait(0.3)
--逐个显示胡的特效
for i = 1, #result.info_list do
local hu_info = result.info_list[i]
local player = self._room:GetPlayerBySeat(hu_info.seat)
local info = self._player_card_info[self:GetPos(hu_info.seat)]
if hu_info.is_win then
local win_list = hu_info.win_list
local list_HuCardEffect = info._viewList_HuEffect
local Effects = {}
--先循环一遍把杠上开花放在最前面
for i = 1, #win_list do
local HuMsg = win_list[i]
if HuMsg.type > 2 and HuMsg.type < 60 then
if self.HuCardImg[HuMsg.type][1] == "tile_cs_gangshanghua" then
local imgPath = "ui://Main_Majiang/tile_cs_gangshanghua"
local imgObj = list_HuCardEffect:AddItemFromPool()
local imgLoader = imgObj:GetChild("loader_img")
imgLoader.url = imgPath
imgObj.visible = false
Effects[#Effects + 1] = imgObj
table.remove(win_list, i)
break
end
end
end
for i = 1, #win_list do
local HuMsg = win_list[i]
-- ↓↓↓先排列好特效图片
if HuMsg.type > 2 and HuMsg.type < 60 then
local sound_name = string.format(self.Sound_path .. "%s/%s.mp3",
ViewUtil.Sex_Chat[player.self_user.sex],
"he" .. HuMsg.type)
ViewUtil.PlaySound(self.asset_group, sound_name)
local imgList = self.HuCardImg[HuMsg.type]
for _, img in pairs(imgList) do
local imgPath = "ui://Main_Majiang/" .. img
local imgObj = list_HuCardEffect:AddItemFromPool()
local imgLoader = imgObj:GetChild("loader_img")
imgLoader.url = imgPath
imgObj.visible = false
Effects[#Effects + 1] = imgObj
end
end
end
--小于四个字段时动态调整胡特效
if info._viewText_cardInfo["huEffet_columnGap"] and #Effects < 4 then
list_HuCardEffect.columnGap = tonumber(info._viewText_cardInfo["huEffet_columnGap"])
else
list_HuCardEffect.columnGap = 0
end
-- ↓↓↓播放动画
for _, imgObj in pairs(Effects) do
imgObj.visible = true
local effect_xingxing = imgObj:GetChild("effect_xingxing")
effect_xingxing:SetPlaySettings(0, -1, 1, -1);
effect_xingxing.visible = true
effect_xingxing.playing = true
effect_xingxing.onPlayEnd:Set(function()
effect_xingxing.visible = false
end)
local imgLoader = imgObj:GetChild("loader_img")
imgLoader:SetScale(2, 2)
imgLoader:Center()
imgLoader:TweenScale(Vector2(1, 1), 0.3)
coroutine.wait(0.5)
end
coroutine.wait(0.3)
list_HuCardEffect:RemoveChildrenToPool()
end
end
--统一显示弹出分数
for i = 1, #result.info_list do
local hu_info = result.info_list[i]
local head_info = self._player_info[self:GetPos(hu_info.seat)]
-- 扣分动画
head_info:UpdateScore(hu_info.total_score, true)
end
coroutine.wait(0.3)
if liuju then
self:PlayMJSound("liuju.mp3")
coroutine.wait(3)
self:PlayMJSound("end_music.mp3")
else
self:PlayMJSound("end_music.mp3")
end
coroutine.wait(0.5)
self.result._view.visible = true
end)
else
self.result._view.visible = true
end
end
end
function M:GenerateAllStepData(data)
local cmdList = self.cmdList
self._step = {}
local step = {}
local info = data.info
step.cmd = ""
step.left_card = info.left_card
step.last_out_seat = 0
step.current_out_seat = 1
step.win = 0
step.niao = 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.card_list = p.hand_card
u.hand_left_count = #u.card_list
u.fz_list = {}
u.outcard_list = {}
u.piao_niao = p.piao_niao
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:CmdGetCard(cmd, index)
local data = self:CopyLastStep(index)
data.cmd = cmd.cmd
data.current_out_seat = cmd.seat
data.left_card = cmd.data.left_count
local u = data.player_card_data[cmd.seat]
u.card_list[#u.card_list + 1] = cmd.data.card
end
function M:CmdOutCard(cmd, index)
local data = self:CopyLastStep(index)
data.cmd = cmd.cmd
data.last_out_seat = cmd.seat
local u = data.player_card_data[cmd.seat]
list_remove(u.card_list, cmd.data.card)
table.sort(u.card_list, self.HandCardSortAndJing)
u.outcard_list[#u.outcard_list + 1] = cmd.data.card
end
function M:CmdAction(cmd, index)
local data = self:CopyLastStep(index)
data.cmd = cmd.cmd
data.last_out_seat = 0
data.current_out_seat = cmd.seat
local u = data.player_card_data[cmd.seat]
for i = 1, #cmd.data.opcard do
list_remove(u.card_list, cmd.data.opcard[i])
end
local fz = {}
fz.type = cmd.data.type
fz.card = cmd.data.card
fz.opcard = cmd.data.opcard
fz.from_seat = cmd.data.from_seat
data.fz = fz
local uf = data.player_card_data[cmd.data.from_seat]
if fz.type ~= FZType.Gang_An and fz.type ~= FZType.Gang_Peng then
table.remove(uf.outcard_list, #uf.outcard_list)
end
if fz.type ~= FZType.Gang_Peng then
u.fz_list[#u.fz_list + 1] = fz
else
for i = 1, #u.fz_list do
if u.fz_list[i].type == FZType.Peng and u.fz_list[i].card == fz.card then
u.fz_list[i].type = FZType.Gang_Peng
end
end
end
end
function M:CmdWin(cmd, index)
local data = self:CopyLastStep(index)
data.cmd = cmd.cmd
data.win = cmd.seat
end
function M:CmdNiao(cmd, index)
local data = self:CopyLastStep(index)
data.cmd = cmd.cmd
data.niao = cmd.data.niao
end
function M:CmdPiao(cmd, index)
local data = self:CopyLastStep(index)
data.cmd = cmd.cmd
data.player_card_data[cmd.seat].piao_niao = cmd.data.num
end
function M:CmdResult(cmd, index)
local data = self:CopyLastStep(index)
data.cmd = cmd.cmd
data.result_data = cmd.data
end
function M:CopyLastStep(index)
local step = {}
local last_step = self._step[index]
step = membe_deep_clone(last_step)
self._step[#self._step + 1] = step
step.result_data = nil
return step
end
function M:UpdateLeftCard(num)
self._tex_LeftCard.text = "" .. num .. ""
end
function M:UpdateCardBox(seat)
local index = seat
local people_num = self._room.room_config.people_num
if people_num == 2 and seat == 2 then
index = 3
elseif people_num == 3 and seat == 3 then
index = 4
end
self._ctr_cardbox.selectedIndex = index
end
function M:UpdateRound()
self._view:GetChild("text_round").text = string.format("局数:%d /%d", self._room.curren_round,
self._room.room_config.round)
end
function M:UpdateStep(step)
self._record:GetChild("tex_step").text = "" .. step .. " / " .. #self._step .. ""
end
function M.HandCardSortAndJing(a, b)
local jing = DataManager.CurrenRoom.jing
if a == jing or b == jing then
if a == b then
return a < b
end
return a == jing
else
if a < 200 then
a = a + 1000
elseif a < 300 then
a = a + 3000
elseif a < 400 then
a = a + 2000
else
a = a + 4000
end
if b < 200 then
b = b + 1000
elseif b < 300 then
b = b + 3000
elseif b < 400 then
b = b + 2000
else
b = b + 4000
end
return a < b
end
end
return M