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.

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