yunque9/lua_probject/extend_project/extend/zipai/fanpaofa/EXGameController.lua

623 lines
21 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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