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.

835 lines
32 KiB

  1. local RoomCmd=MJFramework.MJImport("mj.luaScript.Protocol.MJCmd")
  2. local MJMessage=MJFramework.MJImport("mj.luaScript.Protocol.MJMessage")
  3. local MJDefine=MJFramework.MJImport("mj.luaScript.MJDefine")
  4. local MJProtocol=MJFramework.MJFrameworkClassImprot("mj.luaScript.Protocol.MJProtocol")
  5. local Room = class("linshuiRoom" , MJProtocol)
  6. -- 视角转换
  7. function Room:transPos(targetSeatId, seatId)
  8. local MaxCount = self.roomInfo.nMaxPlayCount
  9. local showPos = 4
  10. local target = targetSeatId
  11. if target <= seatId then
  12. showPos = seatId - target
  13. elseif target > seatId then
  14. showPos = MaxCount - target + seatId
  15. end
  16. return showPos
  17. end
  18. -- 根据uid获取座位号
  19. function Room:getSeatIdByUserId( nUserId )
  20. return self:getSeatIdByViewId(self:getViewIdByUserId(nUserId))
  21. end
  22. -- 获取房间最大玩家人数
  23. function Room:getMaxPlayerCount()
  24. return self.roomInfo.nMaxPlayCount
  25. end
  26. -- 获取房间人数
  27. function Room:getPlayerCount()
  28. local count = 0
  29. for k,v in pairs(self.roomInfo.memberList) do
  30. count = count + 1
  31. end
  32. return count
  33. end
  34. function Room:cleanTingStatus()
  35. local myUserId = app.user.loginInfo.uid
  36. if self.roomInfo.memberList[myUserId] and self.roomInfo.memberList[myUserId].nTingStatus then
  37. self.roomInfo.memberList[myUserId].nTingStatus = MJDefine.MJTingStatus.NoTing
  38. end
  39. end
  40. function Room:onTingCardResult( status, response )
  41. logD("Room:onTingCardResult(), ", table.tostring(response))
  42. print("--------onTingCardResult--------")
  43. if not self.roomInfo then
  44. logD("self.roomInfo no exist,容错处理!")
  45. return
  46. end
  47. self:dispatchEvent({name = MJDefine.MJEvent.TingResult,response = response})
  48. end
  49. function Room:onTingCardStatus(status, response)
  50. logD("Room:onTingCardStatus(), ", table.tostring(response))
  51. if not self.roomInfo then
  52. logD("self.roomInfo no exist,容错处理!")
  53. return
  54. end
  55. local myUserId = app.user.loginInfo.uid
  56. self.roomInfo.memberList[myUserId].nTingStatus=response.nTingStatus
  57. self:dispatchEvent({name = MJDefine.MJEvent.TingSatus})
  58. end
  59. -- 游戏发牌结果
  60. function Room:onGameSendCardResponse(status, response)
  61. logD("-------------------- 游戏发牌 ------------------------")
  62. if not self.roomInfo then
  63. logD("self.roomInfo no exist,容错处理!")
  64. return
  65. end
  66. logD("Room:onGameSendCardResponse(), ", table.tostring(response))
  67. -- self.roomInfo.nbankFirstGrabCard = response.nbankFirstGrabCard
  68. --目前server只发自己过来,后续战绩回放考虑到会发所有玩家来,故以userid为key于扩展
  69. -- local cardData = self:serverCardToMyCard(response.cardList)
  70. -- logD("Room:onGameSendCardResponse : "..table.tostring(cardData))
  71. for k,v in pairs(response.playerCards) do
  72. self.roomInfo.memberList[v.nUserId].handCards = v.handCards
  73. self.roomInfo.memberList[v.nUserId].isBaoPai = v.isTing
  74. logD("------isBaoPai= ",self.roomInfo.memberList[v.nUserId].isBaoPai)
  75. --[[if v.isTing == 1 then
  76. self.roomInfo.memberList[v.nUserId].isBaoPai = 1
  77. end--]]
  78. end
  79. -- self.cards[response.nUserId] = cardData
  80. -- 发送广播通知,发牌开始了
  81. self:dispatchEvent({name = MJDefine.MJEvent.GameSendCardResponse});
  82. end
  83. function Room:onBankerOutCard(status, response)
  84. logD("-------------------- 游戏庄家起手操作------------------------")
  85. if not self.roomInfo then
  86. logD("self.roomInfo no exist,容错处理!")
  87. return
  88. end
  89. self.roomInfo.nLeaveCardNum = response.nLeaveCardNum
  90. self.roomInfo.needOutCardId = response.nUserId
  91. --logD("Room:onBankerOutCard(), ", table.tostring(response))
  92. local myUserId = self:getMyUserId()
  93. self.roomInfo.tings={}
  94. if response.nUserId==myUserId then
  95. -- for k,v in pairs(response.pushCardTing) do
  96. -- self.roomInfo.tings[v.outCard]=v.tingCards.Datas
  97. -- end
  98. self.roomInfo.tings = response.pushCardTing
  99. --这里自己摸牌后,不隐藏听牌提示
  100. --self.roomInfo.memberList[myUserId].nTingStatus=MJDefine.MJTingStatus.NoTing
  101. -- dump(self.roomInfo.memberList[myUserId])
  102. --self:dispatchEvent({name = MJDefine.MJEvent.TingSatus})
  103. end
  104. if self.roomInfo.nLeaveCardNum == 12 or self.roomInfo.nLeaveCardNum == 4 then
  105. local tips = "只剩"..self.roomInfo.nLeaveCardNum.."张牌了!"
  106. local view = require("mj_linshui.luaScript.Views.Compnent.linshuiShowTipsView"):new(tips)
  107. local winSize = cc.Director:getInstance():getVisibleSize()
  108. local pos = cc.p(winSize.width/2,winSize.height/2+150)
  109. view:setPosition(pos)
  110. app.mainScene:addChild(view)
  111. end
  112. -- 发送广播通知,游戏开始了
  113. self:dispatchEvent({name = MJDefine.MJEvent.BankerOutCard ,response = response});
  114. end
  115. function Room:onAfterDingQue(status, response)
  116. logD("-------------------- onAfterDingQue------------------------")
  117. if not self.roomInfo then
  118. logD("self.roomInfo no exist,容错处理!")
  119. return
  120. end
  121. self.roomInfo.nLeaveCardNum = response.nLeaveCardNum
  122. self.roomInfo.needOutCardId = response.nUserId
  123. local myUserId = self:getMyUserId()
  124. self.roomInfo.tings={}
  125. if response.nUserId==myUserId then
  126. self.roomInfo.tings = response.pushCardTing
  127. end
  128. -- 发送广播通知,游戏开始了
  129. self:dispatchEvent({name = MJDefine.MJEvent.AfterDingQue ,response = response});
  130. end
  131. function Room:onBaoPai(status,response)
  132. logD("-------------------- 广播爆牌 ------------------------")
  133. if not self.roomInfo then
  134. print("容错处理")
  135. return
  136. end
  137. local myUserId = self:getMyUserId()
  138. if response.nUserId == myUserId then
  139. self.roomInfo.memberList[myUserId].isBaoPai = response.isBaoPai
  140. end
  141. logD("linshuiRoom:onBaoPai(), response = ", table.tostring(response))
  142. self:dispatchEvent({name = MJDefine.MJEvent.BaoPaiResponse ,response = response});
  143. end
  144. function Room:onBankerBaoPai(status,response)
  145. logD("-------------------- 通知庄家爆牌 ------------------------")
  146. if not self.roomInfo then
  147. print("容错处理")
  148. return
  149. end
  150. logD("linshuiRoom:onBankerBaoPai(), response = ", table.tostring(response))
  151. self:dispatchEvent({name = MJDefine.MJEvent.BankerBaoPai ,response = response});
  152. end
  153. -- 获取听牌信息
  154. function Room:getTingCards()
  155. return self.roomInfo.tings or {};
  156. end
  157. --- Room:getTingCardsByCard 通过指定牌,获取听牌信息
  158. -- @param card int
  159. function Room:getTingCardsByCard (card)
  160. local curTingCards = {};
  161. for k, v in pairs(self.roomInfo.tings) do
  162. if v.outCard == card then
  163. curTingCards = v.tingCards;
  164. break;
  165. end
  166. end
  167. return curTingCards;
  168. end
  169. --断线重连
  170. function Room:onGameReconnection(status,response)
  171. logD("===============重连成功,清空之前所有存在的队列==================")
  172. app.net:onMsgClear()
  173. app.net:onMsgPause()
  174. logD("Room:onGameReconnection(), response = ", table.tostring(response))
  175. self:initRoomInfo();
  176. -- 获取到的房间信息
  177. self.roomInfo.shuffleNum = response.shuffleNum
  178. self.roomInfo.gameId = response.gameId
  179. self.roomInfo.nShowTableId = response.nShowTableId
  180. self.roomInfo.nMaxPlayCount = response.nMaxPlayCount
  181. self.roomInfo.nRoomOwnedUid = response.nRoomOwnedUid
  182. self.roomInfo.nTotalGameNum = response.nTotalGameNum
  183. self.roomInfo.nBaseChips = response.nBaseChips
  184. self.roomInfo.strGameInfo = response.strGameInfo
  185. self.roomInfo.nGameStartCount = response.nGameStartCount
  186. self.roomInfo.nStatus = response.nStatus
  187. self.roomInfo.nBankSeatId = response.nBankSeatId
  188. self.roomInfo.nMySeatId = response.nMySeatId
  189. self.roomInfo.bUserDisbandGame = response.bUserDisbandGame
  190. self.roomInfo.nDismissStateTime = response.nDismissStateTime
  191. self.roomInfo.leaveCards = response.leaveCards
  192. self.roomInfo.nLeaveCardNum = #self.roomInfo.leaveCards
  193. self.roomInfo.outCardUserId = response.outCardUserId
  194. self.roomInfo.outCardSeatId = response.outCardSeatId
  195. self.roomInfo.lastOpCard = response.lastOpCard
  196. --萝卜牌
  197. self.roomInfo.luoboCards = response.luoboCards
  198. self.roomInfo.operates = response.operates
  199. --炮牌
  200. self.roomInfo.paoCards = response.paoCards
  201. self.roomInfo.isNeedOutCard = response.isNeedOutCard
  202. self.roomInfo.needOutCardId = response.needOutCardId
  203. --self.roomInfo.lastOutCard = response.lastOutCard
  204. self.roomInfo.stopFlag = response.stopFlag
  205. self.roomInfo.playerInfos = response.playerInfos
  206. --胡牌玩家列表
  207. self.roomInfo.resultInfos = response.resultInfos
  208. self.roomInfo.opsCntMapString = response.opsCntMapString
  209. self.roomInfo.tingStatus = response.tingStatus==255 and 0 or 1 --服务器-1为没听 0为听
  210. self.roomInfo.tings = response.tingCard
  211. --杠信息
  212. self.roomInfo.ganginfo = response.opsCntMapString or ""
  213. --快速开局信息
  214. self.roomInfo.bUserFastStartGame = response.bUserFastStartGame--是否在快开始界面,1是0否
  215. self.roomInfo.leftFastStartGameTime = response.leftFastStartGameTime--当前快速开始等待时间
  216. --self.roomInfo.pList = response.pList--快速开始状态
  217. if self.roomInfo.nGameStartCount > 0 then
  218. self.roomInfo.nMaxPlayCount = table.nums(response.playerInfos)
  219. end
  220. self.roomInfo.pList = {}
  221. -- 桌子上其他玩家的信息
  222. for k,v in pairs(response.playerInfos) do
  223. self:setMemberInfo(v)
  224. self.dismissInfo[v.nUserId] = v.nDisbandStatus
  225. --这里只记录,暂时没用到。可能战绩回放的时候是需要用的
  226. -- local cardData = self:serverCardToMyCard(v.handCard)
  227. -- self.roomInfo.memberList[v.nUserId].cardList = {}
  228. -- self.roomInfo.memberList[v.nUserId].cardList = cardData
  229. table.insert(self.roomInfo.pList, {nUserId=tonumber(v.nUserId), nStatus = v.nFastStartStatus})
  230. end
  231. local myUserId = self:getMyUserId();
  232. self.roomInfo.memberList[myUserId].nTingStatus = self.roomInfo.tingStatus--response.tingStatus;
  233. --结算信息
  234. for k,v in pairs(response.resultInfos) do
  235. --胡牌者的用户id
  236. self.roomInfo.memberList[v.nUserId].nUserId=v.nUserId
  237. --1胡牌 2听叫 0默认
  238. self.roomInfo.memberList[v.nUserId].userStatus = v.userStatus
  239. --玩家本局输赢情况 0不胡不输 1胡,2点炮或者输
  240. self.roomInfo.memberList[v.nUserId].result=v.result
  241. -- 胡牌牌类型-7对胡、平胡,0为输或者不胡不输
  242. self.roomInfo.memberList[v.nUserId].huType=v.huType
  243. --胡的牌
  244. self.roomInfo.memberList[v.nUserId].huCard=v.huCard
  245. --胡牌顺序
  246. self.roomInfo.memberList[v.nUserId].huOrder=v.huOrder
  247. --谁点的炮
  248. self.roomInfo.memberList[v.nUserId].dpSeatId=v.dpSeatId
  249. --根次数
  250. self.roomInfo.memberList[v.nUserId].genCount=v.genCount
  251. --子胡牌类型(天胡、地胡等)
  252. self.roomInfo.memberList[v.nUserId].subPaiType = v.subPaiType
  253. --是否绝张
  254. self.roomInfo.memberList[v.nUserId].isJueZhang = v.isJueZhang or 0
  255. --是否金钩钓
  256. self.roomInfo.memberList[v.nUserId].isJinGouDiao = v.isJinGouDiao or 0
  257. --是否海底捞月
  258. self.roomInfo.memberList[v.nUserId].isHaiDiLaoYue = v.isHaiDiLaoYue or 0
  259. --是否海底炮
  260. self.roomInfo.memberList[v.nUserId].isHaiDiPao = v.isHaiDiPao or 0
  261. --是否杠上开花
  262. self.roomInfo.memberList[v.nUserId].isGangShangKaiHua = v.isGangShangKaiHua or 0
  263. --是否杠上炮
  264. self.roomInfo.memberList[v.nUserId].isGangShangPao = v.isGangShangPao or 0
  265. --是否抢杠胡
  266. self.roomInfo.memberList[v.nUserId].isQiangGangHu = v.isQiangGangHu or 0
  267. --是否门清
  268. self.roomInfo.memberList[v.nUserId].isMenQing = v.isMenQing or 0
  269. --是否中张
  270. self.roomInfo.memberList[v.nUserId].isZhongZhang = v.isZhongZhang or 0
  271. --重连胡牌着,胡的牌也在手中,需要删掉
  272. local isDeleted = false
  273. if self.roomInfo.memberList[v.nUserId].result > 0 then--胡牌了
  274. for i,t in pairs(self.roomInfo.memberList[v.nUserId].handCards) do
  275. if t.card == v.huCard then
  276. table.remove(self.roomInfo.memberList[v.nUserId].handCards.Datas,i)
  277. isDeleted = true
  278. break
  279. end
  280. end
  281. --table.removeItem(self.roomInfo.memberList[v.nUserId].handCards,self.roomInfo.memberList[v.nUserId].huCard)
  282. if not isDeleted then
  283. table.remove(self.roomInfo.memberList[v.nUserId].handCards.Datas,1)
  284. end
  285. end
  286. end
  287. self:addExtendData(response)
  288. --[[-- 飘信息
  289. for k,v in pairs(response.PiaoInfo) do
  290. self.roomInfo.memberList[v.nUserId].canPiao=v.canPiao
  291. self.roomInfo.memberList[v.nUserId].isPiao=v.isPiao
  292. end--]]
  293. local extInfo = json.decode(response.extJson or "")
  294. local uid = self:getMyUserId()
  295. if extInfo and type(extInfo) == 'table' then
  296. local myInfo = extInfo[tostring(uid)] or {}
  297. self.roomInfo.hosting = myInfo.hosted or 0--托管状态
  298. self.roomInfo.quickStartInfo = extInfo.faststart
  299. if extInfo.offlinetime then
  300. for nUserId,offlinetime in pairs(extInfo.offlinetime) do
  301. self.roomInfo.memberList[tonumber(nUserId)].offlinetime = offlinetime or 0
  302. end
  303. end
  304. end
  305. --更新自己的数据
  306. -- local myUserId = app.user.loginInfo.uid
  307. -- self.cards[myUserId] = self.roomInfo.memberList[myUserId].handCards
  308. print("self.cards[myUserId]:"..table.tostring(self.cards[myUserId]))
  309. -- 更新椅子号
  310. self:updateUserSeateShowId()
  311. local jsonInfo = json.decode(self.roomInfo.strGameInfo)
  312. -- 发送通知
  313. self:dispatchEvent({name = MJDefine.MJEvent.EnterRoomSuccess, gameId = self.roomInfo.gameId or app.gameId, gameType = jsonInfo.gamerule})
  314. end
  315. function Room:addExtendData(response)
  316. end
  317. function Room:setMemberInfo(v)
  318. Room.super.setMemberInfo(self,v)
  319. self.roomInfo.memberList[v.nUserId].nTurnScore = v.nTurnScore--/10
  320. self.roomInfo.memberList[v.nUserId].nTotalMoney = v.nTotalMoney--/10
  321. self.roomInfo.memberList[v.nUserId].fanshu = v.fanshu
  322. --是否大叫
  323. self.roomInfo.memberList[v.nUserId].isDj = v.isDj
  324. --是否花猪
  325. self.roomInfo.memberList[v.nUserId].isHz = v.isHz
  326. --点炮次数
  327. self.roomInfo.memberList[v.nUserId].dpCount = v.dpCount
  328. --点炮顺序
  329. self.roomInfo.memberList[v.nUserId].dpOrder = v.dpOrder
  330. self.roomInfo.memberList[v.nUserId].result = v.result or 0
  331. self.roomInfo.memberList[v.nUserId].huType = v.huType or 0
  332. --是否换过牌
  333. self.roomInfo.memberList[v.nUserId].isSwapCard = v.isSwapCard or 0
  334. --是否定缺
  335. self.roomInfo.memberList[v.nUserId].isDingQue = v.isDingQue or 0
  336. --定缺牌类型 0万 1筒 2条
  337. self.roomInfo.memberList[v.nUserId].nQue = v.nQue or 0
  338. --服务器推荐的最佳定缺牌
  339. self.roomInfo.memberList[v.nUserId].nZjQue = v.nZjQue or 0
  340. self.roomInfo.memberList[v.nUserId].canPiao = v.isPiao
  341. self.roomInfo.memberList[v.nUserId].isPiao = v.piaoType
  342. --是否已爆牌
  343. self.roomInfo.memberList[v.nUserId].isBaoPai = v.baoJiao
  344. --是否可以爆牌
  345. self.roomInfo.memberList[v.nUserId].canBaoPai = v.canBaoJiao
  346. --躺牌
  347. self.roomInfo.memberList[v.nUserId].tangCards = v.tangCards
  348. --摆牌 0没有摆1摆牌2独摆
  349. self.roomInfo.memberList[v.nUserId].isBaiPai = v.isBaiPai or 0
  350. end
  351. function Room:onHuResponse(status,response)
  352. logD("--------------------血战 通知胡 ------------------------")
  353. logD("Room:onHuResponse(), response = ", table.tostring(response))
  354. if not self.roomInfo then
  355. logD("self.roomInfo no exist,容错处理!")
  356. return
  357. end
  358. if self.roomInfo.memberList[response.nUserId] then
  359. self.roomInfo.memberList[response.nUserId].nUserId = response.nUserId
  360. self.roomInfo.memberList[response.nUserId].huCard = response.huCard
  361. self.roomInfo.memberList[response.nUserId].isQiangGng = response.isQiangGng
  362. self.roomInfo.memberList[response.nUserId].isGspHu = response.isGspHu
  363. self.roomInfo.memberList[response.nUserId].isGskhHu = response.isGskhHu
  364. self.roomInfo.memberList[response.nUserId].redRealCard = response.redRealCard
  365. end
  366. self:dispatchEvent({name = MJDefine.MJEvent.HuResponse,response = response});
  367. end
  368. -- 小局结算
  369. function Room:onGameXiaoJuResponse(status, response)
  370. logD("--------------------linshui 小局结算 ------------------------")
  371. if not self.roomInfo then
  372. logD("self.roomInfo no exist,容错处理!")
  373. return
  374. end
  375. -- 一局结束的原因
  376. self.roomInfo.stopFlag=response.stopFlag
  377. -- 房间信息
  378. self.roomInfo.strGameInfo=response.strGameInfo
  379. ---self.roomInfo.resultInfos = response.allPlayerInfo
  380. --杠信息
  381. self.roomInfo.ganginfo = response.opsCntMapString or ""
  382. --玩家信息
  383. for k,v in pairs(response.allPlayerInfo) do
  384. if self.roomInfo.memberList[v.nUserId] then
  385. self.roomInfo.memberList[v.nUserId].nUserId = v.nUserId
  386. --当前局分数
  387. self.roomInfo.memberList[v.nUserId].nTurnScore=v.nTurnScore--/10
  388. --总分
  389. self.roomInfo.memberList[v.nUserId].nTotalMoney=v.nTotalMoney--/10
  390. --番数
  391. self.roomInfo.memberList[v.nUserId].fanshu=v.fanshu
  392. self.roomInfo.memberList[v.nUserId].userStatus = v.userStatus
  393. -- 胡牌牌类型-7对胡、平胡,0为输或者不胡不输
  394. self.roomInfo.memberList[v.nUserId].huType=v.huType
  395. if v.gruoupCards then
  396. for _,group in ipairs(v.gruoupCards) do
  397. group.targetSeatId = self:getSeatIdByUserId(v.nUserId)
  398. end
  399. end
  400. self.roomInfo.memberList[v.nUserId].gruoupCards = v.gruoupCards
  401. self.roomInfo.memberList[v.nUserId].handCards = v.handCards
  402. self.roomInfo.memberList[v.nUserId].outCards = v.outCards
  403. self.roomInfo.memberList[v.nUserId].huCard = v.huCard
  404. --胡牌顺序
  405. self.roomInfo.memberList[v.nUserId].huOrder = v.huOrder
  406. --玩家本局输赢情况 0不胡不输 1胡,2点炮或者输
  407. self.roomInfo.memberList[v.nUserId].result = v.result
  408. --点炮次数
  409. self.roomInfo.memberList[v.nUserId].dpCount = v.dpCount
  410. --谁点炮
  411. self.roomInfo.memberList[v.nUserId].dpSeatId = v.dpSeatId
  412. --点炮顺序
  413. self.roomInfo.memberList[v.nUserId].dpOrder = v.dpOrder
  414. --是否大叫
  415. self.roomInfo.memberList[v.nUserId].isDj = v.isDj
  416. --是否花猪
  417. self.roomInfo.memberList[v.nUserId].isHz = v.isHz
  418. --根次数
  419. self.roomInfo.memberList[v.nUserId].genCount = v.genCount
  420. --是否已爆牌
  421. self.roomInfo.memberList[v.nUserId].isBaoPai = v.isBaoJiao
  422. --子胡牌类型(天胡、地胡等)
  423. self.roomInfo.memberList[v.nUserId].subPaiType = v.subPaiType
  424. --是否绝张
  425. self.roomInfo.memberList[v.nUserId].isJueZhang = v.isJueZhang or 0
  426. --是否金钩钓
  427. self.roomInfo.memberList[v.nUserId].isJinGouDiao = v.isJinGouDiao or 0
  428. --是否海底捞月
  429. self.roomInfo.memberList[v.nUserId].isHaiDiLaoYue = v.isHaiDiLaoYue or 0
  430. --是否海底炮
  431. self.roomInfo.memberList[v.nUserId].isHaiDiPao = v.isHaiDiPao or 0
  432. --是否杠上开花
  433. self.roomInfo.memberList[v.nUserId].isGangShangKaiHua = v.isGangShangKaiHua or 0
  434. --是否杠上炮
  435. self.roomInfo.memberList[v.nUserId].isGangShangPao = v.isGangShangPao or 0
  436. --是否抢杠胡
  437. self.roomInfo.memberList[v.nUserId].isQiangGangHu = v.isQiangGangHu or 0
  438. --是否门清
  439. self.roomInfo.memberList[v.nUserId].isMenQing = v.isMenQing or 0
  440. --是否中张
  441. self.roomInfo.memberList[v.nUserId].isZhongZhang = v.isZhongZhang or 0
  442. --摆牌 0没有摆1摆牌2独摆
  443. self.roomInfo.memberList[v.nUserId].isBaiPai = v.isBaiPai or 0
  444. if self.roomInfo.memberList[v.nUserId].result > 0 then--胡牌了
  445. for i,t in pairs(self.roomInfo.memberList[v.nUserId].handCards) do
  446. if t.card == v.huCard then
  447. table.remove(self.roomInfo.memberList[v.nUserId].handCards.Datas,i)
  448. break
  449. end
  450. end
  451. --table.removeItem(self.roomInfo.memberList[v.nUserId].handCards,self.roomInfo.memberList[v.nUserId].huCard)
  452. end
  453. end
  454. --[[self.roomInfo.resultInfos[v.nUserId].nUserId = v.nUserId
  455. self.roomInfo.resultInfos[v.nUserId].huType=v.huType
  456. --根次数
  457. self.roomInfo.resultInfos[v.nUserId].genCount = v.genCount
  458. --胡牌顺序
  459. self.roomInfo.resultInfos[v.nUserId].huOrder = v.huOrder
  460. --玩家本局输赢情况 0不胡不输 1胡,2点炮或者输
  461. self.roomInfo.resultInfos[v.nUserId].result=v.result
  462. self.roomInfo.resultInfos[v.nUserId].isXiQian=v.isXiQian]]--
  463. end
  464. -- self.roomInfo.playerInfos",VT_Vector(message.XiaojuPlayerInfo),{})
  465. --是否大局结束,结束是1
  466. self.roomInfo.isGameOver=response.isGameOver
  467. --操作统计
  468. self.roomInfo.opsCntMapString=response.opsCntMapString
  469. --萝卜牌
  470. self.roomInfo.luoboCards = response.luoboCards
  471. logD("linshuiRoom:onGameXiaoJuResponse() :", table.tostring(response))
  472. self:dispatchEvent({name = MJDefine.MJEvent.GameXiaoJuResponse,response = response});
  473. end
  474. -- 游戏正式开始
  475. function Room:onGameStartResponse(status, response)
  476. logD("-------------------- 新的一局开始了 ------------------------")
  477. if not self.roomInfo then
  478. logD("self.roomInfo no exist,容错处理!")
  479. return
  480. end
  481. logD("Room:onGameStartResponse(), ", table.tostring(response))
  482. self.roomInfo.nGameStartCount = response.nGameStartCount;
  483. self.roomInfo.nTotalGameNum = response.nTotalGameNum;
  484. self.roomInfo.nRoomOwnedUid = response.nRoomOwnedUid;
  485. self.roomInfo.nBankSeatId = response.nBankSeatId;
  486. self.roomInfo.shuffleList = response.shuffleList;
  487. self.roomInfo.shuffleNum = response.shuffleNum;
  488. self.roomInfo.nLeaveCardNum = 108--72
  489. -- 清空上一局的手牌信息
  490. self.cards = {}
  491. -- 发送广播通知,游戏开始了
  492. self:dispatchEvent({name = MJDefine.MJEvent.GameStartResponse});
  493. end
  494. --大局结算
  495. function Room:onGameDaJuResponse(status, response)
  496. logD("-------------------- 大局结算 ------------------------")
  497. if not self.roomInfo then
  498. logD("self.roomInfo no exist,容错处理!")
  499. return
  500. end
  501. for k,v in pairs(response.nTotalPlayerInfos) do
  502. if self.roomInfo.memberList[v.nUserId] then
  503. --self.roomInfo.memberList[v.nUserId].nTotalInfo=json.decode(v.nTotalInfo)
  504. v.nTotalScore = v.nTotalScore--/10 --血战总分服务器乘以了10,客户端除以10
  505. local countInfo = json.decode(v.countInfo)
  506. self.roomInfo.memberList[v.nUserId].nTotalScore = v.nTotalScore
  507. self.roomInfo.memberList[v.nUserId].roomCard = tonumber(countInfo.DeInfo)--v.roomCard
  508. self.roomInfo.memberList[v.nUserId].costCard = tonumber(countInfo.DeInfo)--v.requireCard
  509. self.dismissInfo[tonumber(v.nUserId)] = tonumber(countInfo.jiesan)
  510. end
  511. end
  512. --房卡消耗
  513. --[[for k,v in pairs(response.costCardInfos) do
  514. if self.roomInfo.memberList[v.nUserId] then
  515. self.roomInfo.memberList[v.nUserId].costCard = v.costCard
  516. end
  517. end--]]
  518. self.roomInfo.stopFlag = response.stopFlag
  519. --[[--解散状态
  520. local disbandStatus = json.decode(response.strDisbandStatus)
  521. for k,v in pairs(disbandStatus) do
  522. self.dismissInfo[tonumber(k)] = tonumber(v)
  523. end--]]
  524. --结束时间
  525. self.roomInfo.nEndTime = response.nEndTime or os.time()
  526. logD("Room:onGameDaJuResponse() :", table.tostring(response))
  527. self:dispatchEvent({name = MJDefine.MJEvent.GameDaJuResponse ,response = response});
  528. end
  529. function Room:pushTing(status,response)
  530. logD("-------------------- Room:pushTing ------------------------")
  531. logD("Room:pushTing(), ", table.tostring(response))
  532. if not self.roomInfo then
  533. print("容错处理")
  534. return
  535. end
  536. self.roomInfo.tings={}
  537. for k,v in pairs(response.pushTing) do
  538. self.roomInfo.tings=response.pushTing
  539. --self.roomInfo.tings[v.outCard]=v.tingCards.Datas
  540. end
  541. self:dispatchEvent({name = MJDefine.MJEvent.OutCardTings})
  542. end
  543. -- 玩家进入桌子成功
  544. function Room:onSitDownSuccessResponse(status, response)
  545. logD("--------------------玩家进入桌子成功--------------------")
  546. logD("Room:onSitDownSuccessResponse(), ", table.tostring(response))
  547. app.net:onMsgClear()
  548. app.net:onMsgPause()
  549. -- 记录当前桌子号
  550. self:initRoomInfo()
  551. -- 获取到的房间信息
  552. -- self.gameId = response.gameId
  553. self.roomInfo.gameId = response.gameId
  554. self.roomInfo.nShowTableId = response.nShowTableId
  555. self.roomInfo.nMaxPlayCount = response.nMaxPlayCount
  556. self.roomInfo.nRoomOwnedUid = response.nRoomOwnedUid
  557. self.roomInfo.nTotalGameNum = response.nTotalGameNum
  558. self.roomInfo.strGameInfo = response.strGameInfo
  559. self.roomInfo.nGameStartCount = response.nGameStartCount or 0
  560. self.roomInfo.nLeaveCardNum = response.nLeaveCardNum or 0
  561. -- 桌子上其他玩家的信息
  562. for k,v in pairs(response.memberList) do
  563. self.roomInfo.memberList[v.nUserId] = v
  564. self.roomInfo.memberList[v.nUserId].nTingStatus=MJDefine.MJTingStatus.NoTing
  565. end
  566. -- 更新椅子号
  567. self:updateUserSeateShowId()
  568. logD("Room:onSitDownSuccessResponse() roomInfo = ", table.tostring(self.roomInfo))
  569. -- 发送通知
  570. self:dispatchEvent({name = MJDefine.MJEvent.EnterRoomSuccess, gameId = self.roomInfo.gameId or app.gameId, gameType = self.roomInfo.strGameInfo.gamerule})
  571. end
  572. function Room:onWaitOperate(status, response)
  573. logD("Room:onWaitOperate(), ", table.tostring(response))
  574. self:dispatchEvent({name = MJDefine.MJEvent.WaitOperate ,response = response});
  575. end
  576. function Room:onQiangDuanOperates(status, response)
  577. logD("Room:onQiangDuanOperates(), ", table.tostring(response))
  578. self:dispatchEvent({name = MJDefine.MJEvent.QiangDuanOperates ,response = response});
  579. end
  580. function Room:onStartPiao(status, response)
  581. logD("Room:onStartPiao(), ", table.tostring(response))
  582. self:dispatchEvent({name = MJDefine.MJEvent.StartPiao ,response = response});
  583. end
  584. function Room:onPiaoResponse(status, response)
  585. logD("Room:onPiaoResponse(), ", table.tostring(response))
  586. self:dispatchEvent({name = MJDefine.MJEvent.PiaoResponse ,response = response});
  587. end
  588. --请求躺牌
  589. function Room:requestTangCards(tangCards,curSelectCard)
  590. local request = MJMessage.TangRequest:new()
  591. request.operateCodes = 2
  592. request.curOutCard = curSelectCard
  593. for _,v in ipairs(tangCards) do
  594. table.insert(request.curTangCards.Datas, v)
  595. end
  596. self:sendResponse{cmd = RoomCmd.GAME_COMMAND_USER_TANG_CARD , sender = request}
  597. end
  598. --躺返回
  599. function Room:onTangResponse(status, response)
  600. logD("Room:onTangResponse(), ", table.tostring(response))
  601. self:dispatchEvent({name = MJDefine.MJEvent.TangPaiResponse ,response = response});
  602. end
  603. --躺错误
  604. function Room:onTangError(status, response)
  605. logD("Room:onTangError(), ", table.tostring(response))
  606. local errCode = response.errCode
  607. if errCode == 1 then
  608. local tips = "请选择正确牌型"
  609. local view = require("mj_linshui.luaScript.Views.Compnent.linshuiShowTipsView"):new(tips)
  610. local winSize = cc.Director:getInstance():getVisibleSize()
  611. local pos = cc.p(winSize.width/2,winSize.height/2+150)
  612. view:setPosition(pos)
  613. app.mainScene:addChild(view)
  614. end
  615. end
  616. --通知换三张
  617. function Room:onNoticeSwapCardResponse(status, response)
  618. logD("Room:onNoticeSwapCardResponse(), ", table.tostring(response))
  619. self:dispatchEvent({name = MJDefine.MJEvent.NoticeSwapCard ,response = response});
  620. end
  621. --请求换三张
  622. function Room:requestSwapCards( cards )
  623. local request = MJMessage.GetSwapCards:new()
  624. for _,v in ipairs(cards) do
  625. table.insert(request.bySwapCard.Datas, v)
  626. --table.insert(request.byOutCard.Datas, v)
  627. end
  628. self:sendResponse{cmd = RoomCmd.GAME_COMMAND_REQUEST_CHANGE_CARD , sender = request}
  629. end
  630. --换三张错误
  631. function Room:onChangeCardError(status,response)
  632. logD("-------------------- 换三张错误 ------------------------")
  633. if not self.roomInfo then
  634. print("容错处理")
  635. return
  636. end
  637. logD("Room:onChangeCardError(), ", table.tostring(response))
  638. local msg = {
  639. [1] = "换牌数量小于3",
  640. [2] = "牌面值错误",
  641. }
  642. local m = msg[response.errFlag] or "换三张未知错误"
  643. showTooltip(""..m)
  644. self:dispatchEvent({name = MJDefine.MJEvent.SwapCardErr ,response = response});
  645. end
  646. --换三张成功
  647. function Room:onChangeCardSucc(status,response)
  648. logD("Room:onChangeCardSucc(), ", table.tostring(response))
  649. self:dispatchEvent({name = MJDefine.MJEvent.SwapCardSucc ,response = response});
  650. end
  651. --换三张成功后的信息
  652. function Room:onChangeCardInfo(status,response)
  653. logD("Room:onChangeCardInfo(), ", table.tostring(response))
  654. self:dispatchEvent({name = MJDefine.MJEvent.SwapCardSuccInfo ,response = response});
  655. end
  656. --服务器通知定缺
  657. function Room:onNoticeDingQueResponse(status,response)
  658. logD("Room:onNoticeDingQueResponse(), ", table.tostring(response))
  659. self:dispatchEvent({name = MJDefine.MJEvent.NoticeDingQue ,response = response});
  660. end
  661. --广播定缺成功
  662. function Room:onDingQueSuccResponse(status,response)
  663. logD("Room:onDingQueSuccResponse(), ", table.tostring(response))
  664. self:dispatchEvent({name = MJDefine.MJEvent.DingQueSucc ,response = response});
  665. end
  666. --定缺成功广播告诉玩家定缺类型
  667. function Room:onDingQueSuccInfoResponse(status,response)
  668. logD("Room:onDingQueSuccInfoResponse(), ", table.tostring(response))
  669. self:dispatchEvent({name = MJDefine.MJEvent.DingQueSuccInfo ,response = response});
  670. end
  671. ---
  672. -- 托管通知
  673. -- @return
  674. --
  675. function Room:onHostingResponse (status, response)
  676. local userList = response.userList
  677. for k, v in ipairs(userList) do
  678. -- 是否托管
  679. if v.nUserId == self:getMyUserId() then
  680. self.roomInfo.hosting = v.status
  681. end
  682. self:dispatchEvent({name = MJDefine.MJEvent.HostingRequest, response = {nUserId = v.nUserId, status = v.status}});
  683. end
  684. end
  685. function Room:ctor(net)
  686. Room.super.ctor(self , net);
  687. -- 请求爆牌
  688. self:defMsgFunc{name = MJDefine.MJEvent.BaoPaiRequest,cmd = RoomCmd.GAME_COMMAND_REQUEST_BAO_PAI,sender = MJMessage.BaoPaiRequest};
  689. --请求换三张
  690. --self:defMsgFunc{name = MJDefine.MJEvent.RequestSwapCard , cmd = RoomCmd.GAME_COMMAND_REQUEST_CHANGE_CARD, sender = MJMessage.SwapCards};
  691. --客户端请求定缺
  692. self:defMsgFunc{name = MJDefine.MJEvent.RequestDingQue , cmd = RoomCmd.GAME_COMMAND_REQUEST_DINGQUE, sender = MJMessage.QueCard};
  693. -- 请求飘
  694. self:defMsgFunc{name = MJDefine.MJEvent.PiaoRequest,cmd = RoomCmd.GAME_COMMAND_NOTIFY_PIAO,sender = MJMessage.PiaoRequest};
  695. -- 请求刷新桌子
  696. self:defMsgFunc{name = MJDefine.MJEvent.GetTableInfo,cmd = RoomCmd.GAME_COMMAND_GET_TABLE_INFO};
  697. --请求躺牌
  698. self:defMsgFunc{name = MJDefine.MJEvent.TangPaiRequest , cmd = RoomCmd.GAME_COMMAND_USER_TANG_CARD, sender = MJMessage.TangRequest};
  699. --玩家出牌的听牌信息
  700. self:defPushMsg{cmd = RoomCmd.GAME_COMMAND_OUT_CARD_TING_INFO,reader = MJMessage.OutCardTingInfo,func = handler(self,self.pushTing)}
  701. self:defPushMsg{cmd = RoomCmd.GAME_COMMAND_BROADCAST_HU,reader = MJMessage.HuRespone,func = handler(self,self.onHuResponse)}
  702. --广播玩家爆牌
  703. self:defPushMsg{cmd = RoomCmd.GAME_COMMAND_BROADCAST_BAO_PAI,reader = MJMessage.BaoPaiResponse,func = handler(self,self.onBaoPai)}
  704. --通知庄家爆牌
  705. self:defPushMsg{cmd = RoomCmd.GAME_COMMAND_BANKER_BAO_PAI,reader = MJMessage.BankerBaoPai,func = handler(self,self.onBankerBaoPai)}
  706. --通知等待操作
  707. self:defPushMsg{cmd = RoomCmd.GAME_COMMAND_WAIT_OPREATE,reader = MJMessage.WaitOperate,func = handler(self,self.onWaitOperate)}
  708. --通知抢断操作
  709. self:defPushMsg{cmd = RoomCmd.GAME_COMMAND_QIANG_DUAN_OPREATE,reader = MJMessage.QiangDuanOperates,func = handler(self,self.onQiangDuanOperates)}
  710. --广播玩家开始飘
  711. self:defPushMsg{cmd = RoomCmd.GAME_COMMAND_NOTIFY_PIAO,reader = MJMessage.PiaoRequest,func = handler(self,self.onStartPiao)}
  712. --广播玩家飘结果
  713. self:defPushMsg{cmd = RoomCmd.GAME_COMMAND_USER_PIAO_RESULT,reader = MJMessage.PiaoResponse,func = handler(self,self.onPiaoResponse)}
  714. --换三张,服务器会通过0x8122通知换牌
  715. self:defPushMsg{cmd = RoomCmd.GAME_COMMAND_BROADCAST_CHANGE_CARD,reader = MJMessage.SwapCards,func = handler(self,self.onNoticeSwapCardResponse)}
  716. --换三张错误
  717. self:defPushMsg{cmd = RoomCmd.GAME_COMMAND_CHANGE_CARD_ERR,reader = MJMessage.SwapCardsErr,func = handler(self,self.onChangeCardError)}
  718. --换三张成功
  719. self:defPushMsg{cmd = RoomCmd.GAME_COMMAND_CHANGE_CARD_SUCC,reader = MJMessage.SwapCardsSucc,func = handler(self,self.onChangeCardSucc)}
  720. --换三张成功后的信息
  721. self:defPushMsg{cmd = RoomCmd.GAME_COMMAND_CHANGE_CARD_INFO,reader = MJMessage.SwapCardsSuccInfo,func = handler(self,self.onChangeCardInfo)}
  722. --服务器通知定缺
  723. self:defPushMsg{cmd = RoomCmd.GAME_COMMAND_BROADCAST_DINGQUE,reader = MJMessage.QueCard,func = handler(self,self.onNoticeDingQueResponse)}
  724. --当玩家操作成功后,通过0x8131广播定缺成功
  725. self:defPushMsg{cmd = RoomCmd.GAME_COMMAND_DINGQUE_SUCC,reader = MJMessage.DingQueSucc,func = handler(self,self.onDingQueSuccResponse)}
  726. --当所有玩家定缺成功后,服务器会通过广播告诉玩家定缺类型
  727. self:defPushMsg{cmd = RoomCmd.GAME_COMMAND_DINGQUE_RESULT,reader = MJMessage.DingQueSuccInfo,func = handler(self,self.onDingQueSuccInfoResponse)}
  728. -- 内容和0x8106保持统一 广播桌子上所有玩家庄家起手操作
  729. self:defPushMsg{cmd = RoomCmd.GAME_COMMAND_START_ROUND_OPERATE, reader = MJMessage.BankerOutCard,func = handler(self , self.onAfterDingQue)};
  730. --广播躺牌结果
  731. self:defPushMsg{cmd = RoomCmd.GAME_COMMAND_USER_TANG_CARD,reader = MJMessage.TangResponse,func = handler(self,self.onTangResponse)}
  732. --躺牌失败
  733. self:defPushMsg{cmd = RoomCmd.GAME_COMMAND_USER_TANG_ERROR,reader = MJMessage.TangError,func = handler(self,self.onTangError)}
  734. -- 请求托管
  735. self:defMsgFunc{name = MJDefine.MJEvent.HostingRequest, cmd = RoomCmd.GAME_COMMAND_REQUEST_TUOGUAN, sender = MJMessage.HostingRequest}
  736. -- 收到托管回调
  737. self:defPushMsg{cmd = RoomCmd.GAME_COMMAND_TUOGUAN_RESPONSE, reader = MJMessage.HostingResponse, func = handler(self,self.onHostingResponse)}
  738. end
  739. return Room;