client3/lua_probject/extend_project/extend/majiang/hechi/EXGameController.lua

496 lines
16 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 TX_Protocol = import(".Protocol")
local FZTipList = require("main.majiang.FZData")
local TX_GameEvent = import(".GameEvent")
local Hu_Type_Name = import(".CS_Win_Type")
local M = {}
--- Create a new GameController
function M.new()
setmetatable(M, { __index = GameController })
local self = setmetatable({}, { __index = M })
self:init("河池麻将")
self.class = "TX_GameController"
return self
end
function M:init(name)
GameController.init(self, name)
self._eventmap[TX_Protocol.GAME_EVT_PLAYER_DEAL] = self.OnEventSendCards
self._eventmap[TX_Protocol.GAME_EVT_CHANGE_ACTIVE_PLAYER] = self.OnEventTurn
self._eventmap[TX_Protocol.GAME_EVT_DRAW] = self.OnEventTakeCard
self._eventmap[TX_Protocol.GAME_EVT_DISCARD_TIP] = self.OnEventOutHint
self._eventmap[TX_Protocol.GAME_EVT_DISCARD] = self.OnEventOutCard
self._eventmap[TX_Protocol.GAME_EVT_FZTIPS] = self.OnEventFzTips
self._eventmap[TX_Protocol.GAME_EVT_ACTION] = self.OnEventFzAction
self._eventmap[TX_Protocol.GAME_EVT_HU] = self.OnEventHu
self._eventmap[TX_Protocol.GAME_EVT_RESULT1] = self.OneventResult1
self._eventmap[TX_Protocol.GAME_EVT_RESULT2] = self.OnEventResult2
self._eventmap[TX_Protocol.GAME_EVT_NIAO] = self.OnEventNiao
self._eventmap[TX_Protocol.GAME_EVT_PIAOTIP] = self.OnEventPiaoTip
self._eventmap[TX_Protocol.GAME_EVT_PIAO] = self.OnEventPiao
self._eventmap[TX_Protocol.GAME_EVT_GANGZI] = self.OnEventGangCards
self._eventmap[TX_Protocol.GAME_EVT_BUGANG] = self.OnEventBuGang
self._eventmap[TX_Protocol.GAME_EVT_RESIDUE_CARD] = self.OnEventResidueCard
end
local __pre_delete_card = false
-- 发送出牌指令到服务器
-------------------------展示牌---------------------------
function M:SendNextCard(card)
local _data = {}
_data["card"] = tonumber(card)
local _client = ControllerManager.GameNetClinet
_client:send(TX_Protocol.GAME_NEXT_CARD, _data)
end
function M:ReqResidueCard()
local _data = {}
_data["card"] = 0
local _client = ControllerManager.GameNetClinet
_client:send(TX_Protocol.GAME_RESIDUE_CARD, _data)
end
------------------------------------------------------------
function M:SendOutCard(card, callback)
local _data = {}
_data["card"] = card
local _room = self._room
local _client = ControllerManager.GameNetClinet
_client:send(TX_Protocol.GAME_DIS_CARD, _data)
-- 进行预删牌处理
local p = _room.self_player
_room.curren_outcard_seat = -1
list_remove(p.card_list, card)
--table.sort(p.card_list, ViewUtil.HandCardSort)
-- 癞子(501)排第一,其他牌按 ViewUtil.HandCardSort 规则排序
if p.card_list and #p.card_list > 1 then
table.sort(p.card_list, function(a, b)
local isLaiziA = (a == 501)
local isLaiziB = (b == 501)
-- 1. 如果 A 是癞子B 不是A 排前面 (返回 true)
if isLaiziA and not isLaiziB then
return true
end
-- 2. 如果 A 不是癞子B 是A 排后面 (返回 false)
if not isLaiziA and isLaiziB then
return false
end
-- 3. 如果两者都是癞子,或都不是癞子,使用标准排序规则
-- 尝试获取比较结果
local result = ViewUtil.HandCardSort(a, b)
-- 兼容处理:如果 ViewUtil.HandCardSort 返回的是数字 (-1, 0, 1)
if type(result) == "number" then
return result < 0
end
-- 如果返回的是布尔值,直接返回
return result
end)
end
p.hand_left_count = p.hand_left_count - 1
if not p.outcard_list then p.outcard_list = {} end
p.outcard_list[#p.outcard_list + 1] = card
__pre_delete_card = true
callback()
end
function M:SendGangCard(card)
local _data = {}
_data["card"] = card
local _client = ControllerManager.GameNetClinet
_client:send(TX_Protocol.GAME_EVT_DOGANG, _data)
end
function M:OnEventGangCards(evt_data)
DispatchEvent(self._dispatcher, TX_GameEvent.SendGangZi, evt_data["gangzi1"], evt_data["gangzi2"],
evt_data["gangnum"], true)
end
function M:OnEventBuGang(evt_data)
DispatchEvent(self._dispatcher, TX_GameEvent.EventBuGang, evt_data["info"][1], evt_data["info"][2], true)
end
function M:OnEventResidueCard(evt_data)
printlog("OnEventResidueCard")
pt(evt_data)
if evt_data.seat ~= DataManager.CurrenRoom.self_player.seat then
return
end
DispatchEvent(self._dispatcher, TX_GameEvent.EventResidueCard, evt_data["residueCard"])
end
-- 发送放子选择到服务器
function M:SendAction(id)
local _data = {}
_data["id"] = id
local _client = ControllerManager.GameNetClinet
_client:send(TX_Protocol.GAME_ACTION, _data)
end
function M:OnEventSendCards(evt_data)
if ViewManager.GetCurrenView().dview_class == LobbyView then
self:ReturnToRoom()
return
end
local _room = self._room
if not _room.room_config.piao_niao or _room.self_player.entrust then
_room.curren_round = _room.curren_round + 1
end
if _room.curren_round > 0 then _room.playing = true end
printlog("开始发牌===========>>>")
pt(evt_data)
local room = DataManager.CurrenRoom
--printlog(evt_data.laiziCard)
--printlog(evt_data.laiziCard2)
--printlog(evt_data.laiziCardBefore)
--printlog(evt_data.laiziCard2Before)
DispatchEvent(self._dispatcher, TX_GameEvent.SendGangZi, 102, 103, 0, true)
-- _room.SelfPlayer.AutoOutCard = false
local handcards = evt_data["card_list"]
local p = _room.self_player
local seat = evt_data["bank_seat"]
self._cacheEvent:Enqueue(function()
_room.banker_seat = seat
for i = 1, #_room.player_list do
_room.player_list[i].hand_left_count = 13
_room.player_list[i].fz_list = {}
_room.player_list[i].card_list = {}
end
p.card_list = handcards
self._room.self_player.hand_left_count = #handcards
--table.sort(handcards, ViewUtil.HandCardSort)
-- 癞子(501)排第一,其他牌按 ViewUtil.HandCardSort 规则排序
if handcards and #handcards > 1 then
table.sort(handcards, function(a, b)
local isLaiziA = (a == 501)
local isLaiziB = (b == 501)
-- 1. 如果 A 是癞子B 不是A 排前面 (返回 true)
if isLaiziA and not isLaiziB then
return true
end
-- 2. 如果 A 不是癞子B 是A 排后面 (返回 false)
if not isLaiziA and isLaiziB then
return false
end
-- 3. 如果两者都是癞子,或都不是癞子,使用标准排序规则
-- 尝试获取比较结果
local result = ViewUtil.HandCardSort(a, b)
-- 兼容处理:如果 ViewUtil.HandCardSort 返回的是数字 (-1, 0, 1)
if type(result) == "number" then
return result < 0
end
-- 如果返回的是布尔值,直接返回
return result
end)
end
DispatchEvent(self._dispatcher, TX_GameEvent.SendCards, p)
end)
end
function M:OnEventOutCard(evt_data)
local seat = evt_data["seat"]
local card = evt_data["card"]
printlog("OnEventOutCard----------------------------------------------")
pt(evt_data)
local ting_list = nil
local p = self._room:GetPlayerBySeat(seat)
self._cacheEvent:Enqueue(function()
local _room = self._room
_room.last_outcard_seat = seat
if seat == _room.self_player.seat and __pre_delete_card then
__pre_delete_card = false
else
if seat == _room.self_player.seat then
list_remove(p.card_list, card)
table.sort(p.card_list, ViewUtil.HandCardSort)
end
p.hand_left_count = p.hand_left_count - 1
if not p.outcard_list then p.outcard_list = {} end
p.outcard_list[#p.outcard_list + 1] = card
DispatchEvent(self._dispatcher, TX_GameEvent.OutCard, p, card)
end
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()
p.hand_left_count = p.hand_left_count + 1
if (seat == _room.self_player.seat) then
_room.self_player.card_list[#_room.self_player.card_list + 1] = card
-- table.sort( _room.self_player.card_list, ViewUtil.HandCardSort )
end
DispatchEvent(self._dispatcher, TX_GameEvent.GetCard, seat, card, left_count)
end)
end
function M:OnEventOutHint(evt_data)
self._cacheEvent:Enqueue(function()
self._room.curren_outcard_seat = self._room.self_player.seat
DispatchEvent(self._dispatcher, TX_GameEvent.OutHint)
end)
end
function M:OnEventTurn(evt_data)
local seat = evt_data["seat"]
self._cacheEvent:Enqueue(function()
-- self._room.curren_outcard_seat = seat
DispatchEvent(self._dispatcher, TX_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 weight = evt_data["weight"]
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.opcard = dtip["opcard"]
-- if (dtip["opcard"]) then
-- local opcard = dtip["opcard"]
-- tip.OpCard = opcard
-- tip.OpCard[3] = tip.Card
-- table.sort(tip.OpCard)
-- end
tiplist:AddTip(tip)
end
DispatchEvent(self._dispatcher, TX_GameEvent.FZTips, tiplist, weight)
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 type = evt_data["type"]
local from_seat = evt_data["from_seat"]
local opcard = evt_data["opcard"]
-- local openkong = evt_data["openkong"]
local p = _room:GetPlayerById(playerid)
self._cacheEvent:Enqueue(function()
local fz = nil
local index = -1
local ftype = type
if (ftype == FZType.Gang_Peng) then
for i = 1, #p.fz_list do
if (p.fz_list[i].card == card) then
p.fz_list[i].card = card
fz = p.fz_list[i]
fz.type = type
index = i - 1
break
end
end
end
fz = {}
fz.card = card
fz.type = type
fz.active_card = actice_card
if (index == -1) then
if (ftype == FZType.Chi) then
local data = {}
data[1] = opcard[1]
data[2] = card
data[3] = opcard[2]
fz.opcard = data
end
p.fz_list[#p.fz_list + 1] = fz
end
fz.from_seat = from_seat
local remove_num = #opcard
if (p == _room.self_player) then
for i = 1, remove_num do
list_remove(p.card_list, opcard[i])
end
end
p.hand_left_count = p.hand_left_count - remove_num
if from_seat ~= p.seat then
-- if (fz.Type == FZType.Chi) then card = actice_card end
local fp = _room:GetPlayerBySeat(from_seat)
table.remove(fp.outcard_list, #fp.outcard_list)
end
DispatchEvent(self._dispatcher, TX_GameEvent.FangziAction, fz, p, index)
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"])
local win_card = evt_data["win_card"]
local win_list = evt_data["win_list"]
self._cacheEvent:Enqueue(function()
win_p.card_list = cards
table.sort(win_p.card_list, ViewUtil.HandCardSort)
-- 【新增代码开始】过滤 win_list 中的无效数据
local filtered_win_list = {}
for i = 1, #win_list do
local item = win_list[i]
if not item then goto continue end
local huType = item.type
local huName = Hu_Type_Name[huType]
-- 1. 基本有效性检查:必须有名字,且名字不为空
if huName and huName ~= "" then
-- 2. 特定过滤逻辑:如果是 "吃三比",则跳过
if huName ~= "吃三比" and huName ~= "七大对" and huName ~= "七大对混一色"and huName ~= "七大对清一色"then
-- 可选如果分数为0也不想要可以加上 and item.score > 0
table.insert(filtered_win_list, item)
end
else
-- 如果没有对应的名字,也视为无效数据,跳过
-- 或者你可以选择保留它,取决于策划需求
end
::continue::
end
-- 使用过滤后的列表派发事件
DispatchEvent(self._dispatcher, TX_GameEvent.ZPHuCard, evt_data["seat"], evt_data["from_seat"], win_card, cards,
filtered_win_list)
end)
end
function M:OneventResult1(evt_data)
local over = evt_data.type
printlog("OneventResult1")
pt(evt_data)
--0小结算 1小大结算 2大结算
self._room._reload_flag = false
self._room.playing = false
if 0 == over then
local result = evt_data.result
self._cacheEvent:Enqueue(function()
for i = 1, #self._room.player_list do
local p = self._room.player_list[i]
p.hand_left_count = 0
p.outcard_list = {}
end
DispatchEvent(self._dispatcher, TX_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, TX_GameEvent.ZPResult2, result, total_result, over);
end)
end
end
-- function M:OnEventResult2(evt_data)
-- DataManager.CurrenRoom.Over = true
-- ControllerManager.SetGameNetClient(nil,true)
-- local info_list = evt_data["info_list"]
-- if self._result ~= nil then
-- self._cacheEvent:Enqueue(function()
-- self:OneventResult1(self._result)
-- self._result = nil
-- end)
-- end
-- self._cacheEvent:Enqueue(function()
-- DispatchEvent(self._dispatcher,TX_GameEvent.ZPResult2, info_list)
-- ControllerManager.ChangeController(LoddyController)
-- end)
-- end
function M:OnEventNiao(evt_data)
local list = evt_data["niao"]
local start_seat = evt_data["start_seat"]
self._cacheEvent:Enqueue(function()
DispatchEvent(self._dispatcher, TX_GameEvent.EventNiao, list, start_seat)
end)
end
function M:OnEventPiaoTip()
if ViewManager.GetCurrenView().dview_class == LobbyView then
self:ReturnToRoom()
return
end
self._cacheEvent:Enqueue(function()
if not self._room._reload_flag then
self._room.curren_round = self._room.curren_round + 1
end
self._room.playing = true
DispatchEvent(self._dispatcher, TX_GameEvent.EvnetPiaoTip, evt_data)
end)
end
function M:OnEventPiao(evt_data)
self._cacheEvent:Enqueue(function()
DispatchEvent(self._dispatcher, TX_GameEvent.EvnetPiao, evt_data.seat, evt_data.num)
end)
end
function M:GetPosString(seat)
if DataManager.CurrenRoom.room_config.people_num ~= 4 then return "" end
if seat == 1 then
return ""
elseif seat == 2 then
return "西"
elseif seat == 3 then
return ""
elseif seat == 4 then
return ""
end
end
function M:Discard(card)
local _data = {}
_data["card"] = card
local _room = self._room
local _client = ControllerManager.GameNetClinet
-- list_remove(_room.SelfPlayer.Cards,card)
-- table.sort(_room.SelfPlayer.Cards)
_client:send(Protocol.Game_Da, _data)
end
return M