您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

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