local MJDefine = MJFramework.MJImport("mj.luaScript.MJDefine") local MJMessage = MJFramework.MJImport("mj.luaScript.Protocol.MJMessage") local MJSound = MJFramework.MJImport("mj.luaScript.MJSound") local CommonHandCard = MJFramework.MJFrameworkClassImprot("mj.luaScript.Common.2d.CommonHandCard") local HandCard2D = class("HandCard2D", CommonHandCard) function HandCard2D:ctor(...) HandCard2D.super.ctor(self, ...) end --- HandCard2D:onAfterCreateHandcards 创建手牌之后的处理 function HandCard2D:onAfterCreateHandcards() HandCard2D.super.onAfterCreateHandcards(self) end --- -- 摊牌之后的处理 -- function HandCard2D:onAfterCreateOpenHandcards() HandCard2D.super.onAfterCreateOpenHandcards(self) end function HandCard2D:createGroupCards(arg, fromViewId) for _, v in pairs(arg) do if not fromViewId then fromViewId = v.fromViewId end local group = nil if v.opType == MJDefine.MJOperateType.OPREATE_ANGANG then group = self:getGroup(v.values[1], {MJDefine.MJOperateType.OPREATE_ANGANG}) if group then group:setCardNum(v.cardNum) group:customRefresh(v) return end end local groupIndex = table.nums(self._groupNodes) + 1 group = self:createGroup(v.values, v.showType, self._viewId, groupIndex, v.cardNum) if group then group.fromViewId = v.fromViewId ---保留触发操作的玩家位置,补杠需要 group.opType = v.opType local x, y = self:getGroupPosition(group, groupIndex) group:setPosition(cc.p(x, y)) group:customRefresh(v) self:addChild(group) table.insert(self._groupNodes, group) end end self:refreshGroupZOrder() end --- -- 补杠 -- @param card 补杠的牌 -- @param cardNum 多头杠牌张数 -- @return -- function HandCard2D:buGang(card, cardNum) local oldGroup = self:getGroup(card, {MJDefine.MJOperateType.OPREATE_BAGANG, MJDefine.MJOperateType.OPREATE_ZHIGANG, MJDefine.MJOperateType.OPREATE_ANGANG}) if oldGroup then -- 如果没有碰牌,则查看是否已经有补杠 local cards = oldGroup:getCards() if cards and cards[4] then if type(oldGroup.setCardNum)=='function' then oldGroup:setCardNum(cardNum) end cards[4]:setOperateBackImage() end return else oldGroup = self:getGroup(card, {MJDefine.MJOperateType.OPREATE_PENG}) if not oldGroup then oldGroup = self:getGroup(card, {MJDefine.MJOperateType.OPREATE_TI}) end end if not oldGroup then return end local fromViewId = oldGroup.fromViewId -- 杠牌对家,换成第四张 if app.room:getMaxPlayerCount() == 2 and fromViewId ~= 0 then fromViewId = 4 end if app.room:getMaxPlayerCount() == 4 and fromViewId == 2 then fromViewId = 4 end local oldPos = oldGroup:getPosition() local index = table.indexOf(self._groupNodes, oldGroup) table.remove(self._groupNodes, index) oldGroup:removeFromParent() local newGroup = self:createGroup({card, card, card, card}, MJDefine.MJGroupType.BaGang, self._viewId, index, cardNum) if not newGroup then return end newGroup.fromViewId = fromViewId newGroup.opType = MJDefine.MJOperateType.OPREATE_BAGANG table.insert(self._groupNodes, index, newGroup) newGroup:setPosition(oldPos) newGroup:customRefresh(newGroup) self:addChild(newGroup) self:refreshGroupZOrder() end --- HandCard2D:retoreBuGang 还原补杠 -- @param card 牌值 -- @param cardNum 牌张数 function HandCard2D:restoreBuGang(card, cardNum) local oldGroup = self:getGroup( card, { MJDefine.MJOperateType.OPREATE_BAGANG, MJDefine.MJOperateType.OPREATE_ANGANG, MJDefine.MJOperateType.OPREATE_ZHIGANG }) if not oldGroup then return end if type(oldGroup.getCardNum)=='function' then local oldCardNum = oldGroup:getCardNum() if oldCardNum > 4 then oldCardNum = oldCardNum - 1 oldGroup:setCardNum(oldCardNum) oldGroup:customRefresh() return end end local fromViewId = oldGroup.fromViewId -- 杠牌对家,换成第四张 if app.room:getMaxPlayerCount() == 2 and fromViewId ~= 0 then fromViewId = 4 end if app.room:getMaxPlayerCount() == 4 and fromViewId == 2 then fromViewId = 4 end local oldPos = oldGroup:getPosition() local index = table.indexOf(self._groupNodes, oldGroup) table.remove(self._groupNodes, index) oldGroup:removeFromParent() local newGroup = self:createGroup({card, card, card}, MJDefine.MJGroupType.Peng, self._viewId, index, cardNum) if not newGroup then return end newGroup.fromViewId = fromViewId newGroup.opType = MJDefine.MJOperateType.OPREATE_PENG table.insert(self._groupNodes, index, newGroup) newGroup:setPosition(oldPos) self:addChild(newGroup) self:refreshGroupZOrder() end -- 重写排序,让听用牌放在最左边,定缺牌放最右边 function HandCard2D:sortHandCards() if self._viewId ~= MJDefine.MyViewId and (not self._isReplay) then--如果不是主视角且不是回放,不需要排序 return end --[[table.sort( self._handCardNodes, function(c1, c2) if c1:getValue() == c2:getValue() and c1.tang and (not c2.tang) then return true else return c1:getValue() < c2:getValue() end end )--]] -- 拆分 local temp = {} local tCard = {} local nCard = {} local qCard = {} for i, v in ipairs(self._handCardNodes) do if v:getIsTingYongCard() then table.insert(tCard, v) elseif v:getIsDingQueCard() or (v:getMJColorType() == self.queType) then table.insert(qCard, v) else table.insert(nCard, v) end end -- 按牌值顺序排序 local function sortFun(c1, c2) return c1:getValue() < c2:getValue() end table.sort(tCard, sortFun) table.sort(nCard, sortFun) table.sort(qCard, sortFun) -- 添加到大表temp里面 for i, v in ipairs(tCard) do table.insert(temp, v) end for i, v in ipairs(nCard) do table.insert(temp, v) end for i, v in ipairs(qCard) do table.insert(temp, v) end self._handCardNodes = temp end function HandCard2D:createCard(value, viewId, mjIndex) local mjType = MJDefine.MJConfig_2d.MJType.Stand logD("HandCard2D:createCard ", MJDefine.MJConfig_2d.MAHJONG_CARD) local linshui_mj_color = loadUserInfo("mj_linshui_desktop_2d_mjType") or MJDefine.DesktopType.TwoDGold local CardClass if linshui_mj_color == "2dl" then CardClass = require("mj_linshui.luaScript.Views.2d.Card_2d_L") else CardClass = require(MJDefine.MJConfig_2d.MAHJONG_CARD) end local mjCard = CardClass:new(value, viewId, mjType, mjIndex) local x, y = self:getCardPosition(mjCard, viewId, mjIndex) mjCard:setPosition(cc.p(x, y)) return mjCard end --发送出牌消息 function HandCard2D:sendOutCard() logD("HandCard2D:sendOutCard") if not (self.isOutCard and self.touchMJ) then logD("HandCard2D:sendOutCard", "不是本家出牌") return end if self.touchMJ:getIsPaoPai() and (not self:getHandCardsIsAllPaoCard()) then self.touchMJ:restorePostion() self.touchMJ:setStatus(MJDefine.MJStatus.Normal) showTooltip("不能打出别人要胡的牌!"); return end logD("HandCard2D:sendOutCard", "touchMJ", self.touchMJ:getValue()) local request = MJMessage.Card:new() request.card = self.touchMJ:getValue() -- logE("LHQRecordView:setOutCardVisible"..table.tostring(request)) self:sendMsg( app.room, MJDefine.MJEvent.OutCard, request, function(status, response) logE("HandCard2D:sendOutCard", "response = ", table.tostring(response)) end ) --音效 local userInfo = app.room:getUserInfoByViewId(self._viewId) local sex = 1 if userInfo then sex = userInfo.sex else logD("HandCard2D:sendOutCard", "userInfo为空,使用默认性别") end MJSound.PlayMJSound(sex, request.card) self:runOutCardAction(self.touchMJ:getValue()) app.room:dispatchEvent({name = MJDefine.MJEvent.LOCAL_OUT_CARD, card = self.touchMJ:getValue()}) app.room:dispatchEvent({name = MJDefine.MJEvent.OutCardFalg, value = self.touchMJ:getValue(), viewId = self._viewId}) self:setOutCardEnable(false) --插牌 if self.touchMJ == self._handCardNodes[#self._handCardNodes] then table.removeItem(self._handCardNodes, self.touchMJ) else table.removeItem(self._handCardNodes, self.touchMJ) self:resetHandCards() end self.touchMJ:removeFromParent() self.touchMJ = nil app.room:dispatchEvent({name = MJDefine.MJEvent.SelectCard}) app.room:dispatchEvent({name = MJDefine.MJEvent.ShowTing}) self:setTing(false) app.room:resetTings() app.room.roomInfo.lastOutViewId = MJDefine.MyViewId self:checkQueAndDisableOtherCard() self:checkBaoAndDisableCard() end return HandCard2D