Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

339 rader
11 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. oldGroup:setCardNum(cardNum)
  60. cards[4]:setOperateBackImage()
  61. end
  62. return
  63. else
  64. oldGroup = self:getGroup(card, {MJDefine.MJOperateType.OPREATE_PENG})
  65. if not oldGroup then
  66. oldGroup = self:getGroup(card, {MJDefine.MJOperateType.OPREATE_TI})
  67. end
  68. end
  69. if not oldGroup then
  70. return
  71. end
  72. local fromViewId = oldGroup.fromViewId
  73. -- 杠牌对家,换成第四张
  74. if app.room:getMaxPlayerCount() == 2 and fromViewId ~= 0 then
  75. fromViewId = 4
  76. end
  77. if app.room:getMaxPlayerCount() == 4 and fromViewId == 2 then
  78. fromViewId = 4
  79. end
  80. local oldPos = oldGroup:getPosition()
  81. local index = table.indexOf(self._groupNodes, oldGroup)
  82. table.remove(self._groupNodes, index)
  83. oldGroup:removeFromParent()
  84. local newGroup = self:createGroup({card, card, card, card}, MJDefine.MJGroupType.BaGang, self._viewId, index, cardNum)
  85. if not newGroup then
  86. return
  87. end
  88. newGroup.fromViewId = fromViewId
  89. newGroup.opType = MJDefine.MJOperateType.OPREATE_BAGANG
  90. table.insert(self._groupNodes, index, newGroup)
  91. newGroup:setPosition(oldPos)
  92. newGroup:customRefresh(newGroup)
  93. self:addChild(newGroup)
  94. self:refreshGroupZOrder()
  95. end
  96. --- HandCard2D:retoreBuGang 还原补杠
  97. -- @param card 牌值
  98. -- @param cardNum 牌张数
  99. function HandCard2D:restoreBuGang(card, cardNum)
  100. local oldGroup =
  101. self:getGroup(
  102. card,
  103. {
  104. MJDefine.MJOperateType.OPREATE_BAGANG,
  105. MJDefine.MJOperateType.OPREATE_ANGANG,
  106. MJDefine.MJOperateType.OPREATE_ZHIGANG
  107. })
  108. if not oldGroup then
  109. return
  110. end
  111. if type(oldGroup.getCardNum)=='function' then
  112. local oldCardNum = oldGroup:getCardNum()
  113. if oldCardNum > 4 then
  114. oldCardNum = oldCardNum - 1
  115. oldGroup:setCardNum(oldCardNum)
  116. oldGroup:customRefresh()
  117. return
  118. end
  119. end
  120. local fromViewId = oldGroup.fromViewId
  121. -- 杠牌对家,换成第四张
  122. if app.room:getMaxPlayerCount() == 2 and fromViewId ~= 0 then
  123. fromViewId = 4
  124. end
  125. if app.room:getMaxPlayerCount() == 4 and fromViewId == 2 then
  126. fromViewId = 4
  127. end
  128. local oldPos = oldGroup:getPosition()
  129. local index = table.indexOf(self._groupNodes, oldGroup)
  130. table.remove(self._groupNodes, index)
  131. oldGroup:removeFromParent()
  132. local newGroup = self:createGroup({card, card, card}, MJDefine.MJGroupType.Peng, self._viewId, index, cardNum)
  133. if not newGroup then
  134. return
  135. end
  136. newGroup.fromViewId = fromViewId
  137. newGroup.opType = MJDefine.MJOperateType.OPREATE_PENG
  138. table.insert(self._groupNodes, index, newGroup)
  139. newGroup:setPosition(oldPos)
  140. self:addChild(newGroup)
  141. self:refreshGroupZOrder()
  142. end
  143. -- 重写排序,让听用牌放在最左边,定缺牌放最右边
  144. function HandCard2D:sortHandCards()
  145. -- 拆分
  146. local temp = {}
  147. local tCard = {}
  148. local nCard = {}
  149. local qCard = {}
  150. for i, v in ipairs(self._handCardNodes) do
  151. if v:getIsTingYongCard() then
  152. table.insert(tCard, v)
  153. elseif v:getIsDingQueCard() or (v:getMJColorType() == self.queType) then
  154. table.insert(qCard, v)
  155. else
  156. table.insert(nCard, v)
  157. end
  158. end
  159. -- 按牌值顺序排序
  160. local function sortFun(c1, c2)
  161. return c1:getValue() < c2:getValue()
  162. end
  163. table.sort(tCard, sortFun)
  164. table.sort(nCard, sortFun)
  165. table.sort(qCard, sortFun)
  166. -- 添加到大表temp里面
  167. for i, v in ipairs(tCard) do
  168. table.insert(temp, v)
  169. end
  170. for i, v in ipairs(nCard) do
  171. table.insert(temp, v)
  172. end
  173. for i, v in ipairs(qCard) do
  174. table.insert(temp, v)
  175. end
  176. self._handCardNodes = temp
  177. end
  178. --发送出牌消息
  179. function HandCard2D:sendOutCard()
  180. app.room:dispatchEvent({name = MJDefine.MJEvent.checkIsNeedSendGuo})
  181. HandCard2D.super.sendOutCard(self)
  182. end
  183. --判断是否符合换三张规则
  184. function HandCard2D:checkIsInSwapRule()
  185. local roomInfo=app.room.roomInfo
  186. local gameInfo=json.decode(roomInfo.strGameInfo)
  187. local selectNums = #self._selectCards
  188. --local tipsMessage = "当前服务器传下来换牌的张数:" .. gameInfo.swapcardcount .. "当前选中的牌张数:" .. selectNums;
  189. --showTooltip(tipsMessage)
  190. if selectNums ~= tonumber(gameInfo.swapcardcount) then
  191. return false
  192. end
  193. local huase = self._selectCards[1]:getMJColorType()
  194. for i,v in pairs(self._selectCards) do
  195. local tHuase = v:getMJColorType()
  196. if tHuase ~= huase then
  197. return false
  198. end
  199. end
  200. return true
  201. end
  202. -- -- todo lwq 血流专用 胡牌后,玩家的牌要躺下
  203. -- function HandCard2D:setIsHupai(hu)
  204. -- self.isHu = hu
  205. -- end
  206. -- function HandCard2D:getIsHupai(hu)
  207. -- return self.isHu
  208. -- end
  209. -- function HandCard2D:resetHandCards()
  210. -- logD("HandCard2D:resetHandCards", "重置手牌")
  211. -- -- if self.isHu and self.isHu == 1 then --todo lwq
  212. -- -- return
  213. -- -- end
  214. -- self:sortHandCards()
  215. -- local startIndex = table.nums(self._groupNodes) * 3
  216. -- for cardIndex, card in ipairs(self._handCardNodes) do
  217. -- local newCardIndex = startIndex + cardIndex
  218. -- local x, y = self:getCardPosition(card, self._viewId, newCardIndex)
  219. -- if (self._viewId ~= MJDefine.MyViewId and self._isReplay) or card:getMJType() == MJDefine.MJConfig_2d.MJType.Open
  220. -- or card:getMJType() == MJDefine.MJConfig_3d.MJType.Open then
  221. -- x, y = self:getOpenCardPosition(card, self._viewId, newCardIndex)
  222. -- else
  223. -- if self._viewId == 1 or self._viewId == 3 then
  224. -- if self.isHu and self.isHu == 1 then
  225. -- x, y = self:getOpenCardPosition(card, self._viewId, newCardIndex)
  226. -- end
  227. -- end
  228. -- end
  229. -- card:setPosition(cc.p(x, y))
  230. -- card:setMJIndex(newCardIndex)
  231. -- if self._viewId ~= 4 then
  232. -- -- 重新排序,手牌可能乱了,需要重新设置一下手牌的背景
  233. -- card:initBackImage()
  234. -- end
  235. -- end
  236. -- self:refreshHandCardZOrder()
  237. -- end
  238. function HandCard2D:getCardPosition(mjCard, viewId, mjIndex)
  239. local x = 0
  240. local y = 0
  241. local cardSize = mjCard:getContentSize()
  242. local offset = self:getHandCardOffestPos(viewId)
  243. local startPos = self:getHandCardStartPos(viewId)
  244. local groupCount = table.nums(self._groupNodes)
  245. local dealCardNum = self:getDealHandCardNum()
  246. if viewId == MJDefine.PlayerViewType.My then
  247. x = startPos.x + (mjIndex - 1) * (cardSize.width + offset.x)
  248. y = startPos.y + offset.y
  249. x = mjIndex == (dealCardNum + 1) and (x + 10) or x
  250. if groupCount > 0 then
  251. x = x - 180 + (4 - groupCount) * 50
  252. end
  253. elseif viewId == MJDefine.PlayerViewType.Right then
  254. x = startPos.x + offset.x
  255. y = startPos.y + (mjIndex - 1) * (cardSize.height + offset.y)
  256. y = mjIndex == (dealCardNum + 1) and (y + 10) or y
  257. if groupCount == 4 then
  258. y = y + 100
  259. elseif groupCount == 3 then
  260. y = y + 70
  261. elseif groupCount == 2 then
  262. y = y + 45
  263. elseif groupCount == 1 then
  264. y = y + 15
  265. end
  266. elseif viewId == MJDefine.PlayerViewType.Top then
  267. x = startPos.x + (1 - mjIndex) * (cardSize.width + offset.x)
  268. y = startPos.y + offset.y
  269. x = mjIndex == (dealCardNum + 1) and (x - 10) or x
  270. if groupCount == 4 then
  271. x = x - 45
  272. elseif groupCount == 3 then
  273. x = x - 35
  274. elseif groupCount == 2 then
  275. x = x - 25
  276. elseif groupCount == 1 then
  277. x = x - 15
  278. end
  279. elseif viewId == MJDefine.PlayerViewType.Left then
  280. x = startPos.x
  281. y = startPos.y + (1 - mjIndex) * (cardSize.height + offset.y)
  282. y = mjIndex == (dealCardNum + 1) and (y - 10) or y
  283. if groupCount == 4 then
  284. y = y - 75
  285. elseif groupCount == 3 then
  286. y = y - 55
  287. elseif groupCount == 2 then
  288. y = y - 30
  289. elseif groupCount == 1 then
  290. if self.isHu and self.isHu == 1 then -- 胡牌以后不是拿着MJDefine.MJConfig_2d.MJType.Open 的牌去判断,间距写大点
  291. y = y - 10 - 70
  292. else
  293. y = y - 10
  294. end
  295. end
  296. end
  297. return x, y
  298. end
  299. return HandCard2D