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_DANIAO_TIP] = self.OnEventDaNiaoTip 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) printlog("OnEventDaNiaoTip") if ViewManager.GetCurrenView().dview_class == LobbyView then self:ReturnToRoom() return end local piao = 1 -- evt_data["piao"] self._cacheEvent:Enqueue( function() DispatchEvent(self._dispatcher, FanPaoFa_GameEvent.OnDaNiaoTips, piao) 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) 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 self._cacheEvent:Enqueue(function() 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) printlog("jefe 0发牌事件===》》》") if ViewManager.GetCurrenView().dview_class == LobbyView then self:ReturnToRoom() return 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 self._cacheEvent:Enqueue(function() _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() 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 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() 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) printlog("jefe OutHint 提示===>>>>") self._cacheEvent:Enqueue(function() DispatchEvent(self._dispatcher,FanPaoFa_GameEvent.OutHint) end) end function M:OnEventTurn(evt_data) local seat = evt_data["seat"] self._cacheEvent:Enqueue(function() DispatchEvent(self._dispatcher,FanPaoFa_GameEvent.EventTurn, seat) end) end function M:OnEventFzTips(evt_data) self._cacheEvent:Enqueue(function() 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) printlog("jefe fangwei 提示===>>>>") pt(evt_data) local seat = evt_data["seat"] local card = evt_data["card"] self._cacheEvent:Enqueue(function() DispatchEvent(self._dispatcher,FanPaoFa_GameEvent.FangWei,seat,card) end) end function M:OnEventFzAction(evt_data) printlog("jefe EventFz 操作提示===>>>>") 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 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 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.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 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 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 then coroutine.start(function() coroutine.wait(0.5) DispatchEvent(self._dispatcher,FanPaoFa_GameEvent.FangziAction, fz, p,isNeedDelHandCard) end) else DispatchEvent(self._dispatcher,FanPaoFa_GameEvent.FangziAction, fz, p,isNeedDelHandCard) 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() 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() 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() DispatchEvent(self._dispatcher,FanPaoFa_GameEvent.ZPResult2, result, total_result, over); end) end end return M