You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

301 lines
9.2 KiB

  1. local MJDefine = MJFramework.MJImport("mj.luaScript.MJDefine")
  2. local MJMessage = MJFramework.MJImport("mj.luaScript.Protocol.MJMessage")
  3. local MJSound = MJFramework.MJImport("mj.luaScript.MJSound")
  4. local CommonHandCard = MJFramework.MJFrameworkClassImprot("mj.luaScript.Common.2d.CommonHandCard")
  5. local HandCard2D = class("HandCard2D", CommonHandCard)
  6. function HandCard2D:ctor(...)
  7. HandCard2D.super.ctor(self, ...)
  8. end
  9. --- HandCard2D:onAfterCreateHandcards 创建手牌之后的处理
  10. function HandCard2D:onAfterCreateHandcards()
  11. HandCard2D.super.onAfterCreateHandcards(self)
  12. end
  13. ---
  14. -- 摊牌之后的处理
  15. --
  16. function HandCard2D:onAfterCreateOpenHandcards()
  17. HandCard2D.super.onAfterCreateOpenHandcards(self)
  18. end
  19. function HandCard2D:createGroupCards(arg, fromViewId)
  20. for _, v in pairs(arg) do
  21. if not fromViewId then
  22. fromViewId = v.fromViewId
  23. end
  24. local group = nil
  25. if v.opType == MJDefine.MJOperateType.OPREATE_ANGANG then
  26. group = self:getGroup(v.values[1], {MJDefine.MJOperateType.OPREATE_ANGANG})
  27. if group then
  28. group:setCardNum(v.cardNum)
  29. group:customRefresh(v)
  30. return
  31. end
  32. end
  33. local groupIndex = table.nums(self._groupNodes) + 1
  34. group = self:createGroup(v.values, v.showType, self._viewId, groupIndex, v.cardNum)
  35. if group then
  36. group.fromViewId = v.fromViewId ---保留触发操作的玩家位置,补杠需要
  37. group.opType = v.opType
  38. local x, y = self:getGroupPosition(group, groupIndex)
  39. group:setPosition(cc.p(x, y))
  40. group:customRefresh(v)
  41. self:addChild(group)
  42. table.insert(self._groupNodes, group)
  43. end
  44. end
  45. self:refreshGroupZOrder()
  46. end
  47. ---
  48. -- 补杠
  49. -- @param card 补杠的牌
  50. -- @param cardNum 多头杠牌张数
  51. -- @return
  52. --
  53. function HandCard2D:buGang(card, cardNum)
  54. local oldGroup = self:getGroup(card, {MJDefine.MJOperateType.OPREATE_BAGANG, MJDefine.MJOperateType.OPREATE_ZHIGANG, MJDefine.MJOperateType.OPREATE_ANGANG})
  55. if oldGroup then
  56. -- 如果没有碰牌,则查看是否已经有补杠
  57. local cards = oldGroup:getCards()
  58. if cards and cards[4] then
  59. if type(oldGroup.setCardNum)=='function' then
  60. oldGroup:setCardNum(cardNum)
  61. end
  62. cards[4]:setOperateBackImage()
  63. end
  64. return
  65. else
  66. oldGroup = self:getGroup(card, {MJDefine.MJOperateType.OPREATE_PENG})
  67. if not oldGroup then
  68. oldGroup = self:getGroup(card, {MJDefine.MJOperateType.OPREATE_TI})
  69. end
  70. end
  71. if not oldGroup then
  72. return
  73. end
  74. local fromViewId = oldGroup.fromViewId
  75. -- 杠牌对家,换成第四张
  76. if app.room:getMaxPlayerCount() == 2 and fromViewId ~= 0 then
  77. fromViewId = 4
  78. end
  79. if app.room:getMaxPlayerCount() == 4 and fromViewId == 2 then
  80. fromViewId = 4
  81. end
  82. local oldPos = oldGroup:getPosition()
  83. local index = table.indexOf(self._groupNodes, oldGroup)
  84. table.remove(self._groupNodes, index)
  85. oldGroup:removeFromParent()
  86. local newGroup = self:createGroup({card, card, card, card}, MJDefine.MJGroupType.BaGang, self._viewId, index, cardNum)
  87. if not newGroup then
  88. return
  89. end
  90. newGroup.fromViewId = fromViewId
  91. newGroup.opType = MJDefine.MJOperateType.OPREATE_BAGANG
  92. table.insert(self._groupNodes, index, newGroup)
  93. newGroup:setPosition(oldPos)
  94. newGroup:customRefresh(newGroup)
  95. self:addChild(newGroup)
  96. self:refreshGroupZOrder()
  97. end
  98. --- HandCard2D:retoreBuGang 还原补杠
  99. -- @param card 牌值
  100. -- @param cardNum 牌张数
  101. function HandCard2D:restoreBuGang(card, cardNum)
  102. local oldGroup =
  103. self:getGroup(
  104. card,
  105. {
  106. MJDefine.MJOperateType.OPREATE_BAGANG,
  107. MJDefine.MJOperateType.OPREATE_ANGANG,
  108. MJDefine.MJOperateType.OPREATE_ZHIGANG
  109. })
  110. if not oldGroup then
  111. return
  112. end
  113. if type(oldGroup.getCardNum)=='function' then
  114. local oldCardNum = oldGroup:getCardNum()
  115. if oldCardNum > 4 then
  116. oldCardNum = oldCardNum - 1
  117. oldGroup:setCardNum(oldCardNum)
  118. oldGroup:customRefresh()
  119. return
  120. end
  121. end
  122. local fromViewId = oldGroup.fromViewId
  123. -- 杠牌对家,换成第四张
  124. if app.room:getMaxPlayerCount() == 2 and fromViewId ~= 0 then
  125. fromViewId = 4
  126. end
  127. if app.room:getMaxPlayerCount() == 4 and fromViewId == 2 then
  128. fromViewId = 4
  129. end
  130. local oldPos = oldGroup:getPosition()
  131. local index = table.indexOf(self._groupNodes, oldGroup)
  132. table.remove(self._groupNodes, index)
  133. oldGroup:removeFromParent()
  134. local newGroup = self:createGroup({card, card, card}, MJDefine.MJGroupType.Peng, self._viewId, index, cardNum)
  135. if not newGroup then
  136. return
  137. end
  138. newGroup.fromViewId = fromViewId
  139. newGroup.opType = MJDefine.MJOperateType.OPREATE_PENG
  140. table.insert(self._groupNodes, index, newGroup)
  141. newGroup:setPosition(oldPos)
  142. self:addChild(newGroup)
  143. self:refreshGroupZOrder()
  144. end
  145. -- 重写排序,让听用牌放在最左边,定缺牌放最右边
  146. function HandCard2D:sortHandCards()
  147. if self._viewId ~= MJDefine.MyViewId and (not self._isReplay) then--如果不是主视角且不是回放,不需要排序
  148. return
  149. end
  150. --[[table.sort(
  151. self._handCardNodes,
  152. function(c1, c2)
  153. if c1:getValue() == c2:getValue() and c1.tang and (not c2.tang) then
  154. return true
  155. else
  156. return c1:getValue() < c2:getValue()
  157. end
  158. end
  159. )--]]
  160. -- 拆分
  161. local temp = {}
  162. local tCard = {}
  163. local nCard = {}
  164. local qCard = {}
  165. for i, v in ipairs(self._handCardNodes) do
  166. if v:getIsTingYongCard() then
  167. table.insert(tCard, v)
  168. elseif v:getIsDingQueCard() or (v:getMJColorType() == self.queType) then
  169. table.insert(qCard, v)
  170. else
  171. table.insert(nCard, v)
  172. end
  173. end
  174. -- 按牌值顺序排序
  175. local function sortFun(c1, c2)
  176. return c1:getValue() < c2:getValue()
  177. end
  178. table.sort(tCard, sortFun)
  179. table.sort(nCard, sortFun)
  180. table.sort(qCard, sortFun)
  181. -- 添加到大表temp里面
  182. for i, v in ipairs(tCard) do
  183. table.insert(temp, v)
  184. end
  185. for i, v in ipairs(nCard) do
  186. table.insert(temp, v)
  187. end
  188. for i, v in ipairs(qCard) do
  189. table.insert(temp, v)
  190. end
  191. self._handCardNodes = temp
  192. end
  193. function HandCard2D:createCard(value, viewId, mjIndex)
  194. local mjType = MJDefine.MJConfig_2d.MJType.Stand
  195. logD("HandCard2D:createCard ", MJDefine.MJConfig_2d.MAHJONG_CARD)
  196. local linshui_mj_color = loadUserInfo("mj_linshui_desktop_2d_mjType") or MJDefine.DesktopType.TwoDGold
  197. local CardClass
  198. if linshui_mj_color == "2dl" then
  199. CardClass = require("mj_linshui.luaScript.Views.2d.Card_2d_L")
  200. else
  201. CardClass = require(MJDefine.MJConfig_2d.MAHJONG_CARD)
  202. end
  203. local mjCard = CardClass:new(value, viewId, mjType, mjIndex)
  204. local x, y = self:getCardPosition(mjCard, viewId, mjIndex)
  205. mjCard:setPosition(cc.p(x, y))
  206. return mjCard
  207. end
  208. --发送出牌消息
  209. function HandCard2D:sendOutCard()
  210. logD("HandCard2D:sendOutCard")
  211. if not (self.isOutCard and self.touchMJ) then
  212. logD("HandCard2D:sendOutCard", "不是本家出牌")
  213. return
  214. end
  215. if self.touchMJ:getIsPaoPai() and (not self:getHandCardsIsAllPaoCard()) then
  216. self.touchMJ:restorePostion()
  217. self.touchMJ:setStatus(MJDefine.MJStatus.Normal)
  218. showTooltip("不能打出别人要胡的牌!");
  219. return
  220. end
  221. logD("HandCard2D:sendOutCard", "touchMJ", self.touchMJ:getValue())
  222. local request = MJMessage.Card:new()
  223. request.card = self.touchMJ:getValue()
  224. -- logE("LHQRecordView:setOutCardVisible"..table.tostring(request))
  225. self:sendMsg(
  226. app.room,
  227. MJDefine.MJEvent.OutCard,
  228. request,
  229. function(status, response)
  230. logE("HandCard2D:sendOutCard", "response = ", table.tostring(response))
  231. end
  232. )
  233. --音效
  234. local userInfo = app.room:getUserInfoByViewId(self._viewId)
  235. local sex = 1
  236. if userInfo then
  237. sex = userInfo.sex
  238. else
  239. logD("HandCard2D:sendOutCard", "userInfo为空,使用默认性别")
  240. end
  241. MJSound.PlayMJSound(sex, request.card)
  242. self:runOutCardAction(self.touchMJ:getValue())
  243. app.room:dispatchEvent({name = MJDefine.MJEvent.LOCAL_OUT_CARD, card = self.touchMJ:getValue()})
  244. app.room:dispatchEvent({name = MJDefine.MJEvent.OutCardFalg, value = self.touchMJ:getValue(), viewId = self._viewId})
  245. self:setOutCardEnable(false)
  246. --插牌
  247. if self.touchMJ == self._handCardNodes[#self._handCardNodes] then
  248. table.removeItem(self._handCardNodes, self.touchMJ)
  249. else
  250. table.removeItem(self._handCardNodes, self.touchMJ)
  251. self:resetHandCards()
  252. end
  253. self.touchMJ:removeFromParent()
  254. self.touchMJ = nil
  255. app.room:dispatchEvent({name = MJDefine.MJEvent.SelectCard})
  256. app.room:dispatchEvent({name = MJDefine.MJEvent.ShowTing})
  257. self:setTing(false)
  258. app.room:resetTings()
  259. app.room.roomInfo.lastOutViewId = MJDefine.MyViewId
  260. self:checkQueAndDisableOtherCard()
  261. self:checkBaoAndDisableCard()
  262. end
  263. return HandCard2D