local RB_Protocol = import(".Protocol") local FZTipList = import(".main.FZData") local FanPaoFa_GameEvent = import(".FanPaoFa_GameEvent") local M = {} --- Create a new HZ_GameController function M.new() setmetatable(M, { __index = GameController }) local self = setmetatable({}, { __index = M }) self:init("放炮罚") self.class = "RB_GameController" return self end function M:init(name) GameController.init(self, name) self._eventmap[RB_Protocol.GAME_EVT_PLAYER_DEAL] = self.OnEventSendCards self._eventmap[RB_Protocol.GAME_EVT_CHANGE_ACTIVE_PLAYER] = self.OnEventTurn self._eventmap[RB_Protocol.GAME_EVT_DRAW] = self.OnEventTakeCard self._eventmap[RB_Protocol.GAME_EVT_DISCARD_TIP] = self.OnEventOutHint self._eventmap[RB_Protocol.GAME_EVT_DISCARD] = self.OnEventOutCard self._eventmap[RB_Protocol.GAME_EVT_FZTIPS] = self.OnEventFzTips self._eventmap[RB_Protocol.GAME_EVT_ACTION] = self.OnEventFzAction self._eventmap[RB_Protocol.GAME_EVT_HU] = self.OnEventHu self._eventmap[RB_Protocol.GAME_EVT_FANGPAO_TIP] = self.OnEventFangWei self._eventmap[RB_Protocol.GAME_EVT_FANGPAO_RSP] = self.OnEventFangPaoOk self._eventmap[RB_Protocol.GAME_EVT_DANIAO_TIP] = self.OnEventDaNiaoTip self._eventmap[RB_Protocol.GAME_EVT_DANIAO] = self.OnEventDaNiao self._eventmap[RB_Protocol.GAME_EVENT_XIPAI] = self.OnEventXiPai self._eventmap[RB_Protocol.GAME_EVENT_NOTIFY_XIPAI] = self.OnEventXiPaiAnim self._eventmap[RB_Protocol.GAME_EVT_RESULT1] = self.OneventResult1 self._eventmap[RB_Protocol.GAME_EVT_QIPAI] = self.OnEventQIPAI self._eventmap[RB_Protocol.GAME_EVT_ADD_CARD] = self.OnAddCard end function M:SendXiPaiAction(callBack) local _data = {} local _client = ControllerManager.GameNetClinet _client:send(RB_Protocol.GAME_XIPAI, _data) self.XiPaiCallBack = callBack end function M:OnEventDaNiaoTip(evt_data) if ViewManager.GetCurrenView().dview_class == LobbyView then self:ReturnToRoom() return end self._cacheEvent:Enqueue( function() if self._callback_popEvent then self._callback_popEvent(true) end local niao = evt_data["niao"] local reload = evt_data["reload"] DispatchEvent(self._dispatcher, FanPaoFa_GameEvent.OnDaNiaoTips, niao, reload) ControllerManager.IsSendCard = true end ) end function M:SendNiao(niao, callBack) local _data = {} _data["niaoflag"] = niao local _client = ControllerManager.GameNetClinet _client:send(RB_Protocol.GAME_EVT_SEND_NIAO, _data) self.NiaoTipsCallBack = callBack end function M:OnEventDaNiao(evt_data) self._cacheEvent:Enqueue( function() if self._callback_popEvent then self._callback_popEvent(true) end local seat = evt_data["seat"] local niao = evt_data["niao"] if seat == DataManager.CurrenRoom.self_player.seat then if self.NiaoTipsCallBack then self.NiaoTipsCallBack() self.NiaoTipsCallBack = nil end end DispatchEvent(self._dispatcher, FanPaoFa_GameEvent.OnEventDaNiao, seat, niao) end ) end function M:OnEventXiPai(evt_data) if evt_data["result"] == 0 then if self.XiPaiCallBack then self.XiPaiCallBack() end else ViewUtil.ErrorTip(1000000, "申请洗牌失败") end end function M:OnEventXiPaiAnim(evt_data) self._cacheEvent:Enqueue(function() local playeridList = evt_data["list"] local isXiPai = false local otherisXiPai = false if playeridList and #playeridList > 0 then for i = 1, #playeridList do local p = self._room:GetPlayerById(playeridList[i]) if p == self._room.self_player then isXiPai = true else otherisXiPai = true end end end DispatchEvent(self._dispatcher, FanPaoFa_GameEvent.EventXiPai, isXiPai, otherisXiPai) end) end -- 发送出牌指令到服务器 function M:SendOutCard(card) local _data = {} _data["card"] = card local _room = self._room local _client = ControllerManager.GameNetClinet if _client ~= nil then _client:send(RB_Protocol.GAME_DIS_CARD, _data) end end --GAME_CHANGE_CARD GAME_DIS_CARD function M:SendChangeCards(card_list) local _data = {} if card_list then _data["card_list"] = card_list else _data["card_list"] = {} end local _client = ControllerManager.GameNetClinet if _client ~= nil then _client:send(RB_Protocol.GAME_CHANGE_CARD, _data) end end function M:SendFangPao(card) local _data = {} if card then _data["card"] = card else _data["card"] = {} end local _client = ControllerManager.GameNetClinet if _client ~= nil then _client:send(RB_Protocol.GAME_EVT_FANGPAO, _data) end end function M:SendChangeTypeFace(TypeFace) -- body local _data = {} _data["typeface"] = TypeFace local _client = ControllerManager.GameNetClinet if _client ~= nil then _client:send(RB_Protocol.GAME_CHANGE_TYPEfACE, _data) end end function M:ConformToNextGame() local _client = ControllerManager.GameNetClinet if _client ~= nil then _client:send(RB_Protocol.GAME_EVT_CHUI) end end -- 发送放子选择到服务器 function M:SendAction(id, num) local _data = {} _data["id"] = id if num ~= nil then _data["biid"] = num end local _client = ControllerManager.GameNetClinet if _client ~= nil then _client:send(RB_Protocol.GAME_ACTION, _data) end end function M:OnEventSendCards(evt_data) if ViewManager.GetCurrenView().dview_class == LobbyView then self:ReturnToRoom() return end self._cacheEvent:Enqueue(function() if self._callback_popEvent then self._callback_popEvent(true) end local _room = self._room _room.curren_round = _room.curren_round + 1 if _room.curren_round > 0 then _room.playing = true end local handcards = {} if evt_data.card_list and #evt_data.card_list > 0 then handcards = evt_data["card_list"] else ViewUtil.ErrorTip(100000, "发牌数据异常") end local p = _room.self_player local seat = nil if evt_data.bank_seat then seat = evt_data["bank_seat"] else ViewUtil.ErrorTip(100001, "发牌座位异常") end _room.banker_seat = seat for i = 1, #_room.player_list do _room.self_player.handcard_list = {} _room.self_player.card_list = {} _room.player_list[i].hand_left_count = 20 _room.player_list[i].fz_list = {} _room.player_list[i].card_list = {} _room.player_list[i].outcard_list = {} _room.player_list[i].hu_xi = 0 end _room.self_player.handcard_list = handcards self._room.self_player.hand_left_count = #handcards DispatchEvent(self._dispatcher, FanPaoFa_GameEvent.SendCards, p) ControllerManager.IsSendCard = true end) end function M:OnEventOutCard(evt_data) local seat = evt_data["seat"] local card = evt_data["card"] --printlog("jefe OnEventOutCard>>>>",card) -- 判断是否对方有偎 local p = self._room:GetPlayerBySeat(seat) self._cacheEvent:Enqueue(function() local _room = self._room if (seat == _room.self_player.seat) then list_remove(_room.self_player.handcard_list, card) end p.DiceCard = card p.hand_left_count = p.hand_left_count - 1 DispatchEvent(self._dispatcher, FanPaoFa_GameEvent.OutCard, p, card) end) end function M:OnEventQIPAI(evt_data) local seat = evt_data["seat"] local card = evt_data["card"] local p = self._room:GetPlayerBySeat(seat) self._cacheEvent:Enqueue(function() if self._callback_popEvent then self._callback_popEvent(true) end local _room = self._room if (not p.outcard_list) then p.outcard_list = {} end p.outcard_list[#p.outcard_list + 1] = card DispatchEvent(self._dispatcher, FanPaoFa_GameEvent.QiCard, seat, card) end) end function M:OnEventTakeCard(evt_data) local _room = self._room local seat = evt_data["seat"] local card = evt_data["card"] local left_count = evt_data["left_count"] local p = _room:GetPlayerBySeat(seat) self._cacheEvent:Enqueue(function() if self._callback_popEvent then self._callback_popEvent(true) end if card ~= 0 then p.DiceCard = card end DispatchEvent(self._dispatcher, FanPaoFa_GameEvent.GetCard, seat, card, left_count) end) end function M:OnAddCard(evt_data) local _room = self._room local seat = evt_data["seat"] local card = evt_data["card"] local p = _room:GetPlayerBySeat(seat) self._cacheEvent:Enqueue(function() if self._callback_popEvent then self._callback_popEvent(true) end p.DiceCard = card p.hand_left_count = p.hand_left_count + 1 if (seat == _room.self_player.seat) then _room.self_player.handcard_list[#_room.self_player.handcard_list + 1] = card end DispatchEvent(self._dispatcher, FanPaoFa_GameEvent.AddCard, seat, card) end) end function M:OnEventOutHint(evt_data) self._cacheEvent:Enqueue(function() if self._callback_popEvent then self._callback_popEvent(true) end DispatchEvent(self._dispatcher, FanPaoFa_GameEvent.OutHint) end) end function M:OnEventTurn(evt_data) local seat = evt_data["seat"] self._cacheEvent:Enqueue(function() if self._callback_popEvent then self._callback_popEvent(true) end DispatchEvent(self._dispatcher, FanPaoFa_GameEvent.EventTurn, seat) end) end function M:OnEventFzTips(evt_data) self._cacheEvent:Enqueue(function() if self._callback_popEvent then self._callback_popEvent(true) end local tiplist = FZTipList.new() local list = evt_data["tip_list"] local uid = evt_data["uid"] local fptype = evt_data['fptype'] for i = 1, #list do local dtip = list[i] local tip = {} tip.id = dtip["id"] -- if false then tip.weight = dtip["weight"] tip.card = dtip["card"] tip.type = dtip["type"] tip.bi_list = dtip["bi_list"] if (dtip["opcard"]) then local opcard = dtip["opcard"] tip.OpCard = opcard table.sort(tip.OpCard) tip.OpCard[3] = tip.Card end tiplist:AddTip(tip) -- end end DispatchEvent(self._dispatcher, FanPaoFa_GameEvent.FZTips, tiplist, uid, fptype) end) end -- 放喂提示 function M:OnEventFangWei(evt_data) local seat = evt_data["seat"] local card = evt_data["card"] self._cacheEvent:Enqueue(function() if self._callback_popEvent then self._callback_popEvent(true) end DispatchEvent(self._dispatcher, FanPaoFa_GameEvent.FangWei, seat, card) end) end --放跑成功 function M:OnEventFangPaoOk(evt_data) local seat = evt_data["seat"] local card = evt_data["card"] self._cacheEvent:Enqueue(function() if self._callback_popEvent then self._callback_popEvent(true) end DispatchEvent(self._dispatcher, FanPaoFa_GameEvent.FangPaoOk, seat, card) end) end function M:OnEventFzAction(evt_data) local _room = self._room local playerid = evt_data["playerid"] local card = evt_data["card"] local actice_card = evt_data["active_card"] local ftype = evt_data["type"] local from_seat = evt_data["from_seat"] local opcard = evt_data["opcard"] local huxi = evt_data["hu_xi"] local p = _room:GetPlayerById(playerid) self._cacheEvent:Enqueue(function() local isNeedDelHandCard = 0 local flag_pengPao = false p.hu_xi = huxi local fz = {} fz.card = card fz.type = ftype fz.active_card = actice_card fz.from_seat = from_seat fz.opcard = opcard local remove_num = #opcard if ftype == RB_FZType.Chi then p.fz_list[#p.fz_list + 1] = fz if (p == _room.self_player) then for i = 1, remove_num do list_remove(_room.self_player.handcard_list, opcard[i]) end end elseif ftype == RB_FZType.Bi then p.fz_list[#p.fz_list + 1] = fz if (p == _room.self_player) then for i = 1, remove_num do list_remove(_room.self_player.handcard_list, opcard[i]) end list_remove(_room.self_player.handcard_list, fz.card) end elseif ftype == RB_FZType.Peng then p.fz_list[#p.fz_list + 1] = fz if (p == _room.self_player) then for i = 1, remove_num do list_remove(_room.self_player.handcard_list, opcard[i]) end end elseif ftype == RB_FZType.Kan then if (p == _room.self_player) then if #opcard == 2 then _room.self_player.handcard_list[#_room.self_player.handcard_list + 1] = card end p.fz_list[#p.fz_list + 1] = fz end elseif ftype == RB_FZType.ChouWei then p.fz_list[#p.fz_list + 1] = fz if (p == _room.self_player) then for i = 1, 2 do list_remove(_room.self_player.handcard_list, opcard[i]) end end elseif ftype == RB_FZType.Wei then p.fz_list[#p.fz_list + 1] = fz if (p == _room.self_player) then for i = 1, remove_num do list_remove(_room.self_player.handcard_list, opcard[i]) end end elseif ftype == RB_FZType.Pao then if (p == _room.self_player) then for i = 1, #p.fz_list do if p.fz_list[i].card == card then flag_pengPao = true if p.fz_list[i].type == RB_FZType.Kan then isNeedDelHandCard = 3 for i = 1, remove_num do list_remove(_room.self_player.handcard_list, opcard[i]) end flag_pengPao = false end remove_num = 0 p.fz_list[i].type = RB_FZType.Pao end end local num = 0 for i = 1, #_room.self_player.handcard_list do if card == _room.self_player.handcard_list[i] then num = num + 1 end end if num > 0 then isNeedDelHandCard = num for i = 1, num do list_remove(_room.self_player.handcard_list, card) end local isAddTi = false for i = 1, #p.fz_list do if p.fz_list[i].card == card then p.fz_list[i].type = RB_FZType.Pao isAddTi = true remove_num = 0 flag_pengPao = true end end if isAddTi == false then p.fz_list[#p.fz_list + 1] = fz end end else local num = 0 for i = 1, #p.fz_list do if p.fz_list[i].card == card then p.fz_list[i].type = RB_FZType.Pao num = 1 remove_num = 0 flag_pengPao = true end end if num == 0 then p.fz_list[#p.fz_list + 1] = fz end end elseif ftype == RB_FZType.Ti then if (p == _room.self_player) then for i = 1, #p.fz_list do if p.fz_list[i].card == card then if p.fz_list[i].type == RB_FZType.Kan then isNeedDelHandCard = 3 for i = 1, remove_num do list_remove(_room.self_player.handcard_list, opcard[i]) end end remove_num = 0 p.fz_list[i].type = RB_FZType.Ti end end local num = 0 for i = 1, #_room.self_player.handcard_list do if card == _room.self_player.handcard_list[i] then num = num + 1 end end if num > 0 then isNeedDelHandCard = num for i = 1, num do list_remove(_room.self_player.handcard_list, card) end local isAddTi = false for i = 1, #p.fz_list do if p.fz_list[i].card == card then p.fz_list[i].type = RB_FZType.Ti remove_num = 0 isAddTi = true end end if isAddTi == false then p.fz_list[#p.fz_list + 1] = fz end end else local num = 0 for i = 1, #p.fz_list do if p.fz_list[i].card == card then p.fz_list[i].type = RB_FZType.Ti remove_num = 0 num = 1 end end if num == 0 then p.fz_list[#p.fz_list + 1] = fz end end end p.hand_left_count = p.hand_left_count - remove_num -- if fz.type == RB_FZType.Pao or fz.type == RB_FZType.Ti or fz.type == RB_FZType.Wei or fz.type == RB_FZType.ChouWei then -- coroutine.start(function() -- -- coroutine.wait(0.88) -- DispatchEvent(self._dispatcher, FanPaoFa_GameEvent.FangziAction, fz, p, isNeedDelHandCard, flag_pengPao) -- end) -- else flag_pengPao = false DispatchEvent(self._dispatcher, FanPaoFa_GameEvent.FangziAction, fz, p, isNeedDelHandCard, flag_pengPao) -- end end) end function M:OnEventHu(evt_data) local cards = evt_data["card"] local win_p = self._room:GetPlayerBySeat(evt_data["seat"]) local lose_p = self._room:GetPlayerBySeat(evt_data["from_seat"]) -- print(win_p.hand_left_count) self._cacheEvent:Enqueue(function() if self._callback_popEvent then self._callback_popEvent(true) end win_p.card_list = cards table.sort(win_p.card_list, ViewUtil.HandCardSort) DispatchEvent(self._dispatcher, FanPaoFa_GameEvent.ZPHuCard, evt_data["seat"], evt_data["from_seat"], cards) end) end function M:OneventResult1(evt_data) local over = evt_data.type --0:小结算 1:小大结算 2:大结算 self._room.playing = false if 0 == over then local result = evt_data.result for i = 1, #self._room.player_list do local p = self._room.player_list[i] p.hand_left_count = 0 p.outcard_list = {} end self._cacheEvent:Enqueue(function() if self._callback_popEvent then self._callback_popEvent(true) end DispatchEvent(self._dispatcher, FanPaoFa_GameEvent.ZPResult1, result); end) elseif 1 == over or 2 == over then DataManager.CurrenRoom.Over = true ControllerManager.SetGameNetClient(nil, true) local total_result = evt_data.total_result local result = evt_data.result self._cacheEvent:Enqueue(function() if self._callback_popEvent then self._callback_popEvent(true) end DispatchEvent(self._dispatcher, FanPaoFa_GameEvent.ZPResult2, result, total_result, over); end) end end return M