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.

216 lines
7.4 KiB

  1. local MJDefine = MJFramework.MJImport("mj.luaScript.MJDefine")
  2. local Mahjong3DHandCard = MJFramework.MJFrameworkClassImprot("mj.luaScript.Common.3d.Mahjong3DHandCard")
  3. local HandCard3D = class("HandCard3D", Mahjong3DHandCard)
  4. function HandCard3D:ctor(...)
  5. HandCard3D.super.ctor(self, ...)
  6. end
  7. function HandCard3D:sortHandCards()
  8. table.sort(
  9. self._handCardNodes,
  10. function(c1, c2)
  11. if c1:getValue() == 0x41 and c2:getValue() == 0x41 then
  12. return false
  13. elseif c1:getValue() == 0x41 then
  14. return true
  15. elseif c2:getValue() == 0x41 then
  16. return false
  17. else
  18. return c1:getValue() < c2:getValue()
  19. end
  20. end
  21. )
  22. end
  23. function HandCard3D:createGroup(values, showType, viewId, groupIndex,redNum)
  24. local group = nil
  25. if showType == MJDefine.MJGroupType.Chi then
  26. group = require(MJDefine.MJConfig_3d.GROUP_CHI):new(values, viewId, groupIndex,redNum)
  27. elseif showType == MJDefine.MJGroupType.Peng then
  28. group = require(MJDefine.MJConfig_3d.GROUP_PENG):new(values, viewId, groupIndex,redNum)
  29. elseif showType == MJDefine.MJGroupType.Gang then
  30. group = require(MJDefine.MJConfig_3d.GROUP_GANG):new(values, viewId, groupIndex,redNum)
  31. elseif showType == MJDefine.MJGroupType.AnGang then
  32. group = require(MJDefine.MJConfig_3d.GROUP_ANGANG):new(values, viewId, groupIndex,redNum)
  33. elseif showType == MJDefine.MJGroupType.BaGang then
  34. group = require(MJDefine.MJConfig_3d.GROUP_BAGANG):new(values, viewId, groupIndex,redNum)
  35. end
  36. if group and viewId == MJDefine.MyViewId then
  37. group:setLocalZOrder(4 - groupIndex)
  38. end
  39. return group
  40. end
  41. function HandCard3D:createGroupCards(arg, fromViewId)
  42. for _, v in pairs(arg) do
  43. if not fromViewId then
  44. fromViewId = v.fromViewId
  45. end
  46. local group = self:createGroup(v.values, v.showType, self._viewId, table.nums(self._groupNodes) + 1,v.redNum)
  47. if group then
  48. local startPos = MJDefine.MJConfig_3d.HandCardStartPos[self._viewId]
  49. local x = startPos.x + MJDefine.MJConfig_3d.GroupOffsetConfig[self._viewId][#self._groupNodes + 1].x
  50. local y = startPos.y + MJDefine.MJConfig_3d.GroupOffsetConfig[self._viewId][#self._groupNodes + 1].y
  51. group.fromViewId = v.fromViewId ---保留触发操作的玩家位置,补杠需要
  52. group.opType = v.opType
  53. group:setPosition(cc.p(x, y))
  54. group:customRefresh(v)
  55. self:addChild(group)
  56. table.insert(self._groupNodes, group)
  57. end
  58. end
  59. self:refreshGroupZOrder()
  60. end
  61. function HandCard3D:removeHandCardByNum(value, num,redNum)
  62. redNum = redNum or 0
  63. if self._viewId == MJDefine.MyViewId or self._isReplay then
  64. for i=1,num do
  65. local mj
  66. if redNum > 0 and i <= redNum then
  67. mj=self:getMjByValue(65) --红中值
  68. else
  69. mj=self:getMjByValue(value)
  70. end
  71. if mj then
  72. table.removeItem(self._handCardNodes,mj)
  73. mj:removeFromParent()
  74. end
  75. end
  76. else
  77. for i = #self._handCardNodes, #self._handCardNodes - num + 1, -1 do
  78. self._handCardNodes[i]:removeFromParent()
  79. table.remove(self._handCardNodes, i)
  80. end
  81. end
  82. end
  83. --- HandCard3D:getGroup 获取已经存在的组合牌
  84. -- @param mjValue int 麻将牌的值
  85. -- @param opTypes table 麻将牌的类型
  86. function HandCard3D:getGroup(mjValue, opTypes)
  87. if type(opTypes) ~= "table" then
  88. opTypes = {opTypes}
  89. end
  90. for _, vv in pairs(opTypes) do
  91. opType = vv
  92. for _, v in pairs(self._groupNodes) do
  93. if v.opType == opType then
  94. local redNum = 0
  95. local mjCards = v:getCards()
  96. for i,v in pairs(mjCards) do
  97. if v:getValue() == 65 then
  98. redNum = redNum + 1
  99. end
  100. end
  101. if v.opType == MJDefine.MJOperateType.OPREATE_ANGANG then
  102. if
  103. (mjCards[1]:getValue() == mjValue or mjCards[2]:getValue() == mjValue or
  104. mjCards[3]:getValue() == mjValue or
  105. mjCards[4]:getValue() == mjValue)
  106. then
  107. return v,redNum
  108. end
  109. else
  110. if
  111. (mjCards[1]:getValue() == mjValue or mjCards[2]:getValue() == mjValue or
  112. mjCards[3]:getValue() == mjValue)
  113. then
  114. return v,redNum
  115. end
  116. end
  117. end
  118. end
  119. end
  120. end
  121. --- HandCard3D:buGang 补杠
  122. function HandCard3D:buGang(card, newRedNum)
  123. local oldGroup,oldRedNum = self:getGroup(card, {MJDefine.MJOperateType.OPREATE_PENG})
  124. if not oldGroup then
  125. return
  126. end
  127. local fromViewId = oldGroup.fromViewId
  128. -- 杠牌对家,换成第四张
  129. if app.room:getMaxPlayerCount() == 2 and fromViewId ~= 0 then
  130. fromViewId = 4
  131. end
  132. if app.room:getMaxPlayerCount() == 4 and fromViewId == 2 then
  133. fromViewId = 4
  134. end
  135. local redNum = newRedNum + oldRedNum
  136. local index = table.indexOf(self._groupNodes, oldGroup)
  137. table.remove(self._groupNodes, index)
  138. oldGroup:removeFromParent()
  139. local newGroup = self:createGroup({card, card, card, card}, MJDefine.MJGroupType.Gang, self._viewId, index, redNum)
  140. if not newGroup then
  141. return
  142. end
  143. newGroup.fromViewId = fromViewId
  144. newGroup.opType = MJDefine.MJOperateType.OPREATE_BAGANG
  145. table.insert(self._groupNodes, index, newGroup)
  146. local startPos = MJDefine.MJConfig_3d.HandCardStartPos[self._viewId]
  147. local x = startPos.x + MJDefine.MJConfig_3d.GroupOffsetConfig[self._viewId][index].x
  148. local y = startPos.y + MJDefine.MJConfig_3d.GroupOffsetConfig[self._viewId][index].y
  149. newGroup:setPosition(cc.p(x, y))
  150. newGroup:customRefresh(newGroup)
  151. self:addChild(newGroup)
  152. self:refreshGroupZOrder()
  153. end
  154. --- HandCard3D:retoreBuGang 还原补杠
  155. -- @param card 牌值
  156. -- @param cardNum 牌张数
  157. function HandCard3D:restoreBuGang(card, newRedNum)
  158. local oldGroup,oldRedNum =
  159. self:getGroup(
  160. card,
  161. {
  162. MJDefine.MJOperateType.OPREATE_BAGANG,
  163. MJDefine.MJOperateType.OPREATE_ANGANG,
  164. MJDefine.MJOperateType.OPREATE_ZHIGANG
  165. })
  166. if not oldGroup then
  167. return
  168. end
  169. local fromViewId = oldGroup.fromViewId
  170. -- 杠牌对家,换成第四张
  171. if app.room:getMaxPlayerCount() == 2 and fromViewId ~= 0 then
  172. fromViewId = 4
  173. end
  174. if app.room:getMaxPlayerCount() == 4 and fromViewId == 2 then
  175. fromViewId = 4
  176. end
  177. local redNum = oldRedNum
  178. local index = table.indexOf(self._groupNodes, oldGroup)
  179. table.remove(self._groupNodes, index)
  180. oldGroup:removeFromParent()
  181. local newGroup = self:createGroup({card, card, card}, MJDefine.MJGroupType.Peng, self._viewId, index,redNum)
  182. if not newGroup then
  183. return
  184. end
  185. newGroup.fromViewId = fromViewId
  186. newGroup.opType = MJDefine.MJOperateType.OPREATE_PENG
  187. table.insert(self._groupNodes, index, newGroup)
  188. local startPos = MJDefine.MJConfig_3d.HandCardStartPos[self._viewId]
  189. local x = startPos.x + MJDefine.MJConfig_3d.GroupOffsetConfig[self._viewId][index].x
  190. local y = startPos.y + MJDefine.MJConfig_3d.GroupOffsetConfig[self._viewId][index].y
  191. newGroup:setPosition(cc.p(x, y))
  192. self:addChild(newGroup)
  193. self:refreshGroupZOrder()
  194. end
  195. return HandCard3D