local RB_Protocol = import(".Protocol") local FZTipList = require("main.zipai.FZData") local RB_GameEvent = import(".RunBeard_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_RESULT1] = self.OneventResult1 self._eventmap[RB_Protocol.GAME_EVT_QIPAI] = self.OnEventQIPAI self._eventmap[RB_Protocol.GAME_EVT_ADD_CARD] = self.OnAddCard self._eventmap[RB_Protocol.GAME_EVENT_XIPAI] = self.OnEventXiPai self._eventmap[RB_Protocol.GAME_EVENT_NOTIFY_XIPAI] = self.OnEventXiPaiAnim end function M:SendXiPaiAction(callBack) local _data = {} local _client = ControllerManager.GameNetClinet _client:send(RB_Protocol.GAME_XIPAI, _data) self.XiPaiCallBack = callBack 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) printlog("洗牌动画===》》》》") pt(evt_data) local playeridList = evt_data["list"] local isXiPai = 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 end end end self._cacheEvent:Enqueue(function() DispatchEvent(self._dispatcher, RB_GameEvent.EventXiPai, isXiPai) 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 printlog("SendChangeCards=======》》》") pt(_data) _client:send(RB_Protocol.GAME_CHANGE_CARD, _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 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, RB_GameEvent.SendCards, p) ---- print("发牌结束=====打开标志") ControllerManager.IsSendCard = true end) end function M:OnEventOutCard(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 (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, RB_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, RB_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, RB_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 = 0 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, RB_GameEvent.AddCard, seat, card) end) end function M:OnEventOutHint(evt_data) self._cacheEvent:Enqueue(function() DispatchEvent(self._dispatcher, RB_GameEvent.OutHint) end) end function M:OnEventTurn(evt_data) local seat = evt_data["seat"] self._cacheEvent:Enqueue(function() DispatchEvent(self._dispatcher, RB_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"] for i = 1, #list do local dtip = list[i] local tip = {} tip.id = dtip["id"] 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 DispatchEvent(self._dispatcher, RB_GameEvent.FZTips, tiplist, uid) 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 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, RB_GameEvent.FangziAction, fz, p, isNeedDelHandCard) end) else DispatchEvent(self._dispatcher, RB_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, RB_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, RB_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, RB_GameEvent.ZPResult2, result, total_result, over); end) end end return M