25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

358 lines
12 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. function HandCard2D:createGroup(values, showType, viewId, groupIndex, cardNum)
  48. local group = nil
  49. if showType == MJDefine.MJGroupType.Chi then
  50. group = require(MJDefine.MJConfig_2d.GROUP_CHI):new(values, viewId, groupIndex)
  51. elseif showType == MJDefine.MJGroupType.Peng then
  52. group = require(MJDefine.MJConfig_2d.GROUP_PENG):new(values, viewId, groupIndex)
  53. elseif showType == MJDefine.MJGroupType.Gang then
  54. group = require(MJDefine.MJConfig_2d.GROUP_GANG):new(values, viewId, groupIndex, cardNum)
  55. elseif showType == MJDefine.MJGroupType.AnGang then
  56. group = require(MJDefine.MJConfig_2d.GROUP_ANGANG):new(values, viewId, groupIndex, cardNum)
  57. elseif showType == MJDefine.MJGroupType.BaGang then
  58. group = require(MJDefine.MJConfig_2d.GROUP_BAGANG):new(values, viewId, groupIndex, cardNum)
  59. elseif showType == MJDefine.MJGroupType.Fei then
  60. group = require(MJDefine.MJConfig_2d.GROUP_FEI):new(values, viewId, groupIndex)
  61. elseif showType == MJDefine.MJGroupType.Ti then
  62. group = require(MJDefine.MJConfig_2d.GROUP_TI):new(values, viewId, groupIndex)
  63. end
  64. return group
  65. end
  66. ---
  67. -- 补杠
  68. -- @param card 补杠的牌
  69. -- @param cardNum 多头杠牌张数
  70. -- @return
  71. --
  72. function HandCard2D:buGang(card, cardNum)
  73. local oldGroup = self:getGroup(card, {MJDefine.MJOperateType.OPREATE_BAGANG, MJDefine.MJOperateType.OPREATE_ZHIGANG, MJDefine.MJOperateType.OPREATE_ANGANG})
  74. if oldGroup then
  75. -- 如果没有碰牌,则查看是否已经有补杠
  76. local cards = oldGroup:getCards()
  77. if cards and cards[4] then
  78. oldGroup:setCardNum(cardNum)
  79. cards[4]:setOperateBackImage()
  80. end
  81. return
  82. else
  83. oldGroup = self:getGroup(card, {MJDefine.MJOperateType.OPREATE_PENG})
  84. if not oldGroup then
  85. oldGroup = self:getGroup(card, {MJDefine.MJOperateType.OPREATE_TI})
  86. end
  87. end
  88. if not oldGroup then
  89. return
  90. end
  91. local fromViewId = oldGroup.fromViewId
  92. -- 杠牌对家,换成第四张
  93. if app.room:getMaxPlayerCount() == 2 and fromViewId ~= 0 then
  94. fromViewId = 4
  95. end
  96. if app.room:getMaxPlayerCount() == 4 and fromViewId == 2 then
  97. fromViewId = 4
  98. end
  99. local oldPos = oldGroup:getPosition()
  100. local index = table.indexOf(self._groupNodes, oldGroup)
  101. table.remove(self._groupNodes, index)
  102. oldGroup:removeFromParent()
  103. local newGroup = self:createGroup({card, card, card, card}, MJDefine.MJGroupType.BaGang, self._viewId, index, cardNum)
  104. if not newGroup then
  105. return
  106. end
  107. newGroup.fromViewId = fromViewId
  108. newGroup.opType = MJDefine.MJOperateType.OPREATE_BAGANG
  109. table.insert(self._groupNodes, index, newGroup)
  110. newGroup:setPosition(oldPos)
  111. newGroup:customRefresh(newGroup)
  112. self:addChild(newGroup)
  113. self:refreshGroupZOrder()
  114. end
  115. --- HandCard2D:retoreBuGang 还原补杠
  116. -- @param card 牌值
  117. -- @param cardNum 牌张数
  118. function HandCard2D:restoreBuGang(card, cardNum)
  119. local oldGroup =
  120. self:getGroup(
  121. card,
  122. {
  123. MJDefine.MJOperateType.OPREATE_BAGANG,
  124. MJDefine.MJOperateType.OPREATE_ANGANG,
  125. MJDefine.MJOperateType.OPREATE_ZHIGANG
  126. })
  127. if not oldGroup then
  128. return
  129. end
  130. local oldCardNum = oldGroup:getCardNum()
  131. if oldCardNum > 4 then
  132. oldCardNum = oldCardNum - 1
  133. oldGroup:setCardNum(oldCardNum)
  134. oldGroup:customRefresh()
  135. return
  136. end
  137. local fromViewId = oldGroup.fromViewId
  138. -- 杠牌对家,换成第四张
  139. if app.room:getMaxPlayerCount() == 2 and fromViewId ~= 0 then
  140. fromViewId = 4
  141. end
  142. if app.room:getMaxPlayerCount() == 4 and fromViewId == 2 then
  143. fromViewId = 4
  144. end
  145. local oldPos = oldGroup:getPosition()
  146. local index = table.indexOf(self._groupNodes, oldGroup)
  147. table.remove(self._groupNodes, index)
  148. oldGroup:removeFromParent()
  149. local newGroup = self:createGroup({card, card, card}, MJDefine.MJGroupType.Peng, self._viewId, index, cardNum)
  150. if not newGroup then
  151. return
  152. end
  153. newGroup.fromViewId = fromViewId
  154. newGroup.opType = MJDefine.MJOperateType.OPREATE_PENG
  155. table.insert(self._groupNodes, index, newGroup)
  156. newGroup:setPosition(oldPos)
  157. self:addChild(newGroup)
  158. self:refreshGroupZOrder()
  159. end
  160. -- 提操作(这里是用换牌操作,所以要改变类型; 当然也可以使用移除重新原有位置上添加的操作处理)
  161. function HandCard2D:ti(value, lziCard)
  162. -- 更改操作牌
  163. local group = self:getGroup(value, {MJDefine.MJOperateType.OPREATE_FEI})
  164. local cards = group:getCards()
  165. for i, v in pairs(cards) do
  166. local cardValue = v:getValue()
  167. if cardValue ~= value then
  168. v:setValue(value)
  169. v:setValueImage(value)
  170. v:setIsTingYongCard(false)
  171. end
  172. end
  173. -- 操作类型从提更改为碰
  174. group.opType = MJDefine.MJOperateType.OPREATE_TI
  175. -- 更改手牌
  176. if self:getViewId() == MJDefine.PlayerViewType.My or self._isReplay then
  177. local card = self:getMjByValue(value)
  178. card:setValue(lziCard)
  179. card:setValueImage(lziCard)
  180. card:setIsTingYongCard(true)
  181. -- 提操作后,要把提的牌重置到最后一张。如果是不需要放置最后一张,注释代码即可
  182. self:removeHandCard(lziCard)
  183. self:resetHandCards()
  184. self:createHandCards(lziCard)
  185. local lastCard = self:getLastCard() -- 最后一张就是刚创建的牌了
  186. lastCard:setIsTingYongCard(true)
  187. end
  188. end
  189. -- 检查出牌
  190. -- 添加判断所有玩家是否都定缺完毕
  191. -- 添加不可打出听用牌
  192. -- 添加打出最后一张手牌,也会重置手牌顺序
  193. function HandCard2D:sendOutCard()
  194. local gameRule = app.room.roomInfo:getGameRule()
  195. if getNumBand(gameRule.specialrule, 0x01) > 0 then
  196. if table.nums(app.room.roomInfo:getDingQueInfo()) ~= app.room:getPlayerCount() then
  197. showTooltip('等待其他玩家操作定缺')
  198. return
  199. end
  200. end
  201. if self.touchMJ:getIsTingYongCard() then
  202. if self.touchMJ:getPositionY() > MJDefine.MJ_TOUCH_OUT_CARD_Y then
  203. self.touchMJ:restorePostion()
  204. self.touchMJ:setStatus(MJDefine.MJStatus.Normal)
  205. -- app.room:dispatchEvent({name = MJDefine.MJEvent.SelectCard}) -- 广播
  206. app.room:dispatchEvent({name = MJDefine.MJEvent.ShowTing}) -- 广播
  207. end
  208. showTooltip('不可打出听用牌')
  209. return
  210. end
  211. if not (self.isOutCard and self.touchMJ) then
  212. return
  213. end
  214. local request = MJMessage.Card:new()
  215. request.card = self.touchMJ:getValue()
  216. -- logE("LHQRecordView:setOutCardVisible"..table.tostring(request))
  217. self:sendMsg(
  218. app.room,
  219. MJDefine.MJEvent.OutCard,
  220. request,
  221. function(status, response)
  222. logE("MJHandCardView sendOutCard() response = ", table.tostring(response))
  223. end
  224. )
  225. --音效
  226. local userInfo = app.room:getUserInfoByViewId(self._viewId)
  227. if userInfo then
  228. MJSound.PlayMJSound(userInfo.sex, request.card)
  229. end
  230. self:runOutCardAction(self.touchMJ:getValue())
  231. app.room:dispatchEvent({name = MJDefine.MJEvent.OutCardFalg, value = self.touchMJ:getValue(), viewId = self._viewId})
  232. app.room:dispatchEvent({name = MJDefine.MJEvent.LOCAL_OUT_CARD, card = self.touchMJ:getValue()})
  233. self:setOutCardEnable(false)
  234. --插牌
  235. if self.touchMJ == self._handCardNodes[#self._handCardNodes] then
  236. table.removeItem(self._handCardNodes, self.touchMJ)
  237. self:resetHandCards() -- 打出最后一张手牌,也要刷新手牌
  238. else
  239. table.removeItem(self._handCardNodes, self.touchMJ)
  240. self:runInsertCardAction()
  241. end
  242. self.touchMJ:removeFromParent()
  243. self.touchMJ = nil
  244. app.room:dispatchEvent({name = MJDefine.MJEvent.SelectCard})
  245. app.room:dispatchEvent({name = MJDefine.MJEvent.ShowTing})
  246. self:setTing(false)
  247. app.room:resetTings()
  248. app.room.roomInfo.lastOutViewId = MJDefine.MyViewId
  249. end
  250. -- 判断手牌是否全是听用牌(针对胡操作,如果全是听用则不显示过操作)
  251. function HandCard2D:getIsAllTingYongCard()
  252. local handCardNode = self:getHandCardNodes()
  253. for i, v in pairs(handCardNode) do
  254. if not v:getIsTingYongCard() then
  255. return false
  256. end
  257. end
  258. return true
  259. end
  260. -- 重写排序,让听用牌放在最左边,定缺牌放最右边
  261. function HandCard2D:sortHandCards()
  262. -- 拆分
  263. local temp = {}
  264. local tCard = {}
  265. local nCard = {}
  266. local qCard = {}
  267. for i, v in ipairs(self._handCardNodes) do
  268. if v:getIsTingYongCard() then
  269. table.insert(tCard, v)
  270. elseif v:getIsDingQueCard() then
  271. table.insert(qCard, v)
  272. else
  273. table.insert(nCard, v)
  274. end
  275. end
  276. -- 按牌值顺序排序
  277. local function sortFun(c1, c2)
  278. return c1:getValue() < c2:getValue()
  279. end
  280. table.sort(tCard, sortFun)
  281. table.sort(nCard, sortFun)
  282. table.sort(qCard, sortFun)
  283. -- 添加到大表temp里面
  284. for i, v in ipairs(tCard) do
  285. table.insert(temp, v)
  286. end
  287. for i, v in ipairs(nCard) do
  288. table.insert(temp, v)
  289. end
  290. for i, v in ipairs(qCard) do
  291. table.insert(temp, v)
  292. end
  293. self._handCardNodes = temp
  294. end
  295. -- 重写创建手牌,根据viewID,走不同的创建方式
  296. function HandCard2D:createHandCards(cards, isHuCard)
  297. if self._viewId == MJDefine.MyViewId then
  298. HandCard2D.super.createHandCards(self, cards)
  299. else
  300. if isHuCard then
  301. self:createOpenHandCards(cards)
  302. else
  303. HandCard2D.super.createHandCards(self, cards)
  304. end
  305. end
  306. end
  307. function HandCard2D:cleanTouchMJ()
  308. if self.touchMJ then
  309. self.touchMJ = nil
  310. end
  311. end
  312. return HandCard2D