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.

781 lines
25 KiB

  1. local MJRoomToolView=MJFramework.MJImport("mj.luaScript.Views.Room.MJRoomToolView")
  2. local MJRoomMessageView=MJFramework.MJImport("mj.luaScript.Views.Room.MJRoomMessageView")
  3. local MJRoomPlayerView=MJFramework.MJImport("mj.luaScript.Views.Room.MJRoomPlayerView")
  4. local MJDefine=MJFramework.MJImport("mj.luaScript.MJDefine")
  5. local MJFunction=MJFramework.MJImport("mj.luaScript.MJFunction")
  6. local MJHandCardView=MJFramework.MJImport("mj.luaScript.Views.Game.MJHandCardView")
  7. local MJRoomDirection=MJFramework.MJImport("mj.luaScript.Views.Room.MJRoomDirection")
  8. local MJWanFa=MJFramework.MJImport("luaScript.SubGameDefine.MaJiang.MJWanFa")
  9. local MJAnimationCompnent=MJFramework.MJImport("mj.luaScript.Views.Compnent.MJAnimationCompnent")
  10. local MJSound=MJFramework.MJImport("mj.luaScript.MJSound")
  11. local MJRoomReplayView=MJFramework.MJFrameworkClassImprot("mj.luaScript.Views.Room.MJRoomReplayView")
  12. local huamajiangRoomReplayView = class("huamajiangRoomReplayView", MJRoomReplayView)
  13. function huamajiangRoomReplayView:ctor(data)
  14. huamajiangRoomReplayView.super.ctor(self,data)
  15. -- --玩家牌局面板
  16. -- self.playerHandCards={}
  17. -- self.data=data
  18. -- app:changeGameProtocol(app.gameId,1)
  19. end
  20. function huamajiangRoomReplayView:loadUI()
  21. local ui = loadUI("mj_huamajiang/res/ui_fangjian/mj_huamajiang_roomView.ui")
  22. self.ui = ui;
  23. self:addChild(ui);
  24. end
  25. function huamajiangRoomReplayView:onEnter()
  26. huamajiangRoomReplayView.super.onEnter(self)
  27. self:loadTextureCache();
  28. self:setCheckDefault()
  29. self.huOrder = 0
  30. --初始化胡牌顺序
  31. self.huIndex = 1
  32. -- self.ui.Items.Button_Ting_Info:setVisible(false)
  33. self.direcionView:removeFromParent();
  34. self.direcionView:retain();
  35. self:addToLayer("background", self.direcionView);
  36. self:bindEvent(app.room, MJDefine.MJEvent.EVENT_BTN_SHOW_FLOW_VIEW_CLICKED, handler(self, self.onEventBtnShowFlowViewClicked));
  37. self:doSound();
  38. self:initLogo()
  39. end
  40. function huamajiangRoomReplayView:loadTextureCache()
  41. huamajiangRoomReplayView.super.loadTextureCache(self)
  42. loadSpriteFrameFile("mj_huamajiang/res/zy_fangjian/anim/huamajiang_effect_guangxiao.plist")
  43. loadSpriteFrameFile("mj_huamajiang/res/zy_fangjian/anim/huamajiang_effect_guafeng.plist")
  44. loadSpriteFrameFile("mj_huamajiang/res/zy_fangjian/anim/huamajiang_effect_xiayu.plist")
  45. end
  46. function huamajiangRoomReplayView:initGameButton ()
  47. huamajiangRoomReplayView.super.initGameButton(self);
  48. self.toolView:setFlowVisible(false);
  49. self.ui.Items.Layout_Ting_Tip_Card_Panel:setVisible(false);
  50. end
  51. function huamajiangRoomReplayView:updateRoomData( ... )
  52. huamajiangRoomReplayView.super.updateRoomData(self, ...);
  53. end
  54. function huamajiangRoomReplayView:parseData()
  55. self.piaotimes = 0--记录有几次飘操作,为了飘完后删除飘字
  56. local data = self.data
  57. --战报解析
  58. app.room.roomInfo:setLuoBoCards({}); -- 先清空一下萝卜数据
  59. self.reports={}
  60. local ops=string.split(data.ops,"|")
  61. for k,v in pairs(ops) do
  62. local op=string.split(v,",")
  63. local nUserId=tonumber(op[1])
  64. local opType=op[2]
  65. local opStr = op[3]
  66. if opType == "PreOpt" then
  67. local opList = {}
  68. if nUserId==0 then
  69. local temp = string.split(opStr, ";")
  70. for k,v in pairs(temp) do
  71. local temp2 = string.split(v, " ")
  72. local userId = tonumber(temp2[1])
  73. table.remove(temp2,1)
  74. local operates = temp2
  75. table.insert(opList,{nUserId = userId,operates = self:margeOperates(operates) })
  76. end
  77. else
  78. local operates = string.split(opStr, " ")
  79. table.insert(opList,{nUserId = nUserId,operates = self:margeOperates(operates) })
  80. end
  81. table.insert(self.reports,{opType=opType,opList=opList})
  82. elseif opType == "HuanPai" then
  83. self.huanPai = self.huanPai or {}
  84. local huanCards = {}
  85. local tCards = string.split(opStr, "_")
  86. for i,v in pairs(tCards) do
  87. if v and tonumber(v) then
  88. table.insert(huanCards,tonumber(v))
  89. end
  90. end
  91. table.insert(self.huanPai,{nUserId=nUserId,opType="HuanPai",cards = huanCards })
  92. local op=string.split(ops[k+1],",")
  93. local opType=op[2]
  94. if opType ~= "HuanPai" then
  95. table.insert(self.reports,{huanPaiInfo=self.huanPai,opType="HuanPai" })
  96. end
  97. elseif opType == "HuanPaiType" then
  98. local temp = string.split(opStr, "_")
  99. local huanPaiType = tonumber(temp[1])
  100. table.insert(self.reports,{nUserId=nUserId,opType=opType,huanPaiType = huanPaiType })
  101. elseif opType == "HuanPaiDone" then
  102. self.huanPaiDone = self.huanPaiDone or {}
  103. local huanCards = {}
  104. local tCards = string.split(opStr, "_")
  105. for i,v in pairs(tCards) do
  106. if v and tonumber(v) then
  107. table.insert(huanCards,tonumber(v))
  108. end
  109. end
  110. table.insert(self.huanPaiDone,{nUserId=nUserId,opType="HuanPaiDone",cards = huanCards })
  111. local op=string.split(ops[k+1],",")
  112. local opType=op[2]
  113. if opType ~= "HuanPaiDone" then
  114. table.insert(self.reports,{huanPaiInfo=self.huanPaiDone,opType="HuanPaiDone" })
  115. end
  116. elseif opType == "SubOp" then --提交的操作
  117. local temp = string.split(opStr, "_")
  118. local submitOp = tonumber(temp[1])
  119. table.insert(self.reports,{nUserId=nUserId,opType=opType,submitOp = submitOp })
  120. elseif opType == "Piao" then
  121. self.piaotimes = self.piaotimes + 1
  122. local ops = string.split(opStr, "_")
  123. local piaostate = tonumber(ops[1])
  124. table.insert(self.reports,{nUserId=nUserId,opType=opType,piaostate = piaostate })
  125. elseif opType == "Luob" then
  126. local cards = string.split(opStr, "_");
  127. table.insert(self.reports, {nUserId = nUserId, opType = opType, cards = cards});
  128. elseif "Dis"~=opType then
  129. -- 弃牌
  130. local tCards = string.split(opStr, "_")
  131. local card,cardNum = nil,0
  132. if tCards[1] then card = tonumber(tCards[1]) end
  133. if tCards[2] then cardNum = tonumber(tCards[2]) end
  134. table.insert(self.reports,{nUserId=nUserId,opType=opType,card=card,cardNum=cardNum})
  135. end
  136. end
  137. if self.data.ext.liushui then
  138. local userId = app.room:getMyUserId();
  139. local tmpScoreInfo = {};
  140. for k, v in pairs(self.data.ext.liushui) do
  141. if tonumber(k) == userId then
  142. tmpScoreInfo = v;
  143. break;
  144. end
  145. end
  146. local scoreInfo = {};
  147. for k, v in pairs(tmpScoreInfo) do
  148. local arr = string.split(v, ";");
  149. -- gs;hs;ht;ls;ot;oc:gf;seat1_seat2_
  150. local obj = {
  151. gs = tonumber(arr[1]),
  152. hs = tonumber(arr[2]),
  153. ht = tonumber(arr[3]),
  154. ls = tonumber(arr[4]),
  155. ot = tonumber(arr[5]),
  156. oc = tonumber(arr[6]),
  157. gf = tonumber(arr[7]),
  158. seat = string.gsub(arr[8], "_", ";"),
  159. ss = tonumber(arr[9]),
  160. sl = tonumber(arr[10]),
  161. };
  162. table.insert(scoreInfo, obj);
  163. end
  164. self.scoreInfo = scoreInfo;
  165. self.scoreIndex = 1;
  166. -- app.room.roomInfo:setScoreInfo(scoreInfo);
  167. else
  168. self.scoreIndex = 1;
  169. self.scoreInfo = {}
  170. end
  171. end
  172. --合并操作 只显示一个杠
  173. function huamajiangRoomReplayView:margeOperates(operates)
  174. local ops = {}
  175. local isGang = false
  176. for k,v in pairs(operates) do
  177. local op = tonumber(v)
  178. if (op==MJDefine.MJOperateType.OPREATE_ZHIGANG)
  179. or (op==MJDefine.MJOperateType.OPREATE_BAGANG)
  180. or (op==MJDefine.MJOperateType.OPREATE_ANGANG) then
  181. if not isGang then
  182. table.insert(ops,op)
  183. isGang = true
  184. end
  185. else
  186. table.insert(ops,op)
  187. end
  188. end
  189. return ops
  190. end
  191. function huamajiangRoomReplayView:startGame()
  192. self:onGameStartResponse()
  193. --设置为回放模式
  194. for k,v in pairs(self.playerHandCards) do
  195. v:setReplay(true)
  196. end
  197. self:onGameSendCardResponse()
  198. self.playerHandCards[MJDefine.MyViewId]:removeTouchEvent()
  199. end
  200. function huamajiangRoomReplayView:initHanders()
  201. huamajiangRoomReplayView.super.initHanders(self)
  202. self.handers["In"]=handler(self,self.onGetCard) -- 发牌
  203. self.handers["Out"]=handler(self,self.onOutCard) -- 出牌
  204. self.handers["Piao"] = handler(self,self.onPiaoRes) -- 飘
  205. self.handers["Bao"] = handler(self,self.onBaoPaiRes) -- 报
  206. self.handers["DianPao"] = handler(self,self.onDianPao)
  207. self.handers["PaoHu"] = handler(self,self.onPlayerHu) -- 点炮胡
  208. self.handers["QiangGHu"] = handler(self,self.onPlayerHu) -- 抢杠胡
  209. self.handers["GangSH"] = handler(self, self.onPlayerHu)
  210. self.handers["ZiMo"] = handler(self,self.onPlayerHu) -- 自摸胡
  211. self.handers["PreOpt"] = handler(self,self.onShowOperates) -- 显示操作
  212. self.handers["SubOp"] = handler(self,self.onSubmitOperate) -- 提交操作
  213. self.handers["OpWait"] = handler(self,self.onActionWait) -- 等待操作
  214. self.handers["Luob"] = handler(self,self.onActionLuoBo) -- 翻萝卜
  215. self.handers["HuanPaiType"]=handler(self,self.onHuanPaiType)
  216. self.handers["HuanPaiDone"]=handler(self,self.onHuanPaiDone)
  217. self.handers["HuanPai"]=handler(self,self.onHuanPai)
  218. end
  219. function huamajiangRoomReplayView:onGetCard(data)
  220. local roomInfo=app.room.roomInfo
  221. roomInfo.nLeaveCardNum=roomInfo.nLeaveCardNum-1
  222. local response={
  223. nUserId=data.nUserId,
  224. card=data.card,
  225. -- operates={},
  226. nSeatId=roomInfo.memberList[data.nUserId].nSeatId,
  227. nLeaveCardNum = roomInfo.nLeaveCardNum,
  228. }
  229. self:onBankerOutCard({response=response})
  230. end
  231. function huamajiangRoomReplayView:onActionLuoBo( data )
  232. local luoboCards = app.room.roomInfo:getLuoBoCards();
  233. for _, v in ipairs(data.cards) do
  234. table.insert(luoboCards, tonumber(v))
  235. end
  236. app.room.roomInfo:setLuoBoCards(luoboCards);
  237. if not self.isFirstFanLuoBo then
  238. self.isFirstFanLuoBo = true;
  239. app.room.roomInfo.nLeaveCardNum = app.room.roomInfo.nLeaveCardNum - #luoboCards;
  240. else
  241. app.room.roomInfo.nLeaveCardNum = app.room.roomInfo.nLeaveCardNum - 1;
  242. end
  243. self:onFanLuoBoResponse();
  244. for _, v in pairs(self.playerHandCards) do
  245. v:refreshLuoBoCards();
  246. end
  247. end
  248. function huamajiangRoomReplayView:onActionWait(data)
  249. local response = {
  250. nUserId = data.nUserId,
  251. opType = data.card,
  252. }
  253. self:onWaitOperate({response = response})
  254. end
  255. function huamajiangRoomReplayView:onSubmitOperate(data)
  256. local viewId = app.room:getViewIdByUserId(data.nUserId)
  257. local Layout_Operate = self.playerHandCards[viewId].ui.Items.Layout_Operate
  258. local btn = Layout_Operate:getChildByTag(data.submitOp)
  259. if btn then
  260. local hand = cc.Sprite:create("mj/res/ui/zy_fangjian/mj_room_hand.png")
  261. btn:addChild(hand)
  262. local size = btn:getContentSize()
  263. hand:setPosition(cc.p(size.width/2+20,size.height/2-20))
  264. local action = cc.Sequence:create(cc.MoveBy:create(0.5,cc.p(-10,10)),cc.MoveBy:create(0.5,cc.p(10,-10)))
  265. hand:runAction(cc.RepeatForever:create(action))
  266. -- if data.submitOp == MJDefine.MJOperateType.OPREATE_CANCEL then
  267. btn:runAction(cc.Sequence:create(cc.DelayTime:create(1),cc.CallFunc:create(function()
  268. self.playerHandCards[viewId]:hideOperate()
  269. end)))
  270. -- end
  271. end
  272. end
  273. function huamajiangRoomReplayView:onShowOperates(data)
  274. local opList = data.opList
  275. for k,v in pairs(opList) do
  276. local nUserId = v.nUserId
  277. local operates = v.operates
  278. local viewId=app.room:getViewIdByUserId(nUserId)
  279. local Layout_Operate = self.playerHandCards[viewId].ui.Items.Layout_Operate
  280. Layout_Operate:removeAllChildren()
  281. Layout_Operate:setVisible(true)
  282. local x=Layout_Operate:getContentSize().width
  283. if viewId==MJDefine.PlayerViewType.Left then
  284. x = 0
  285. end
  286. table.insert(operates,1,MJDefine.MJOperateType.OPREATE_CANCEL)
  287. local y=Layout_Operate:getContentSize().height/2
  288. local function createOperate(op,isLeft)
  289. local btnOperate=cc.Button:createNode()
  290. btnOperate:setDefaults()
  291. btnOperate:setText("")
  292. btnOperate:loadTextureNormal(MJDefine.MJOperateImage[op])
  293. if isLeft then
  294. x = x + MJDefine.MJ_OPERATE_PADDING
  295. else
  296. x = x -MJDefine.MJ_OPERATE_PADDING
  297. end
  298. btnOperate:setPosition(cc.p(x,y))
  299. btnOperate:setTag(op)
  300. Layout_Operate:addChild(btnOperate)
  301. end
  302. if viewId==MJDefine.PlayerViewType.Left then
  303. for i = #operates,1,-1 do
  304. local op = tonumber(operates[i])
  305. createOperate(op,true)
  306. end
  307. else
  308. for _,strOp in pairs(operates) do
  309. local op = tonumber(strOp)
  310. createOperate(op,false)
  311. end
  312. end
  313. -- self.playerHandCards[viewId]:
  314. if viewId~=MJDefine.MyViewId then
  315. local node = self.playerView.allNodes[viewId]
  316. local pos = cc.pAdd(node.player:getPosition(),cc.p(38,66))
  317. if viewId==MJDefine.PlayerViewType.Left then
  318. Layout_Operate:setAnchorPoint(cc.p(0,0.5))
  319. elseif viewId==MJDefine.PlayerViewType.Top then
  320. pos.y = pos.y-33
  321. end
  322. Layout_Operate:setPosition(pos)
  323. Layout_Operate:setScale(0.7)
  324. end
  325. end
  326. end
  327. function huamajiangRoomReplayView:onOperate(data)
  328. local roomInfo=app.room.roomInfo
  329. local operates={
  330. ["Peng"]=MJDefine.MJOperateType.OPREATE_PENG,
  331. ["BaGang"]=MJDefine.MJOperateType.OPREATE_BAGANG,
  332. ["AnGang"]=MJDefine.MJOperateType.OPREATE_ANGANG,
  333. ["Gang"]=MJDefine.MJOperateType.OPREATE_ZHIGANG,
  334. ["ZhiGang"]=MJDefine.MJOperateType.OPREATE_ZHIGANG,
  335. }
  336. self.fromSeatId = self.fromSeatId or roomInfo.memberList[data.nUserId].nSeatId
  337. local response={
  338. nUserId=data.nUserId,
  339. opCard=data.card,
  340. cardNum = data.cardNum,
  341. opType=operates[data.opType],
  342. -- operates={},
  343. nSeatId=roomInfo.memberList[data.nUserId].nSeatId,
  344. isNeedOutCard=0,
  345. fromSeatId=self.fromSeatId,
  346. }
  347. --碰了之后需要出牌
  348. if data.opType=="Peng" then
  349. response.isNeedOutCard=1
  350. end
  351. for _,v in pairs(self.playerHandCards) do
  352. v:hideOperate()
  353. end
  354. self:onOperationCodeSuccess({response=response})
  355. self:updateScoreInfo(response.opType, response.opCard);
  356. end
  357. function huamajiangRoomReplayView:onOutCard(data)
  358. local roomInfo=app.room.roomInfo
  359. local response={
  360. nUserId=data.nUserId,
  361. card=data.card,
  362. operates={},
  363. -- nSeatId=roomInfo.memberList[data.nUserId].nSeatId,
  364. }
  365. self.fromSeatId=roomInfo.memberList[data.nUserId].nSeatId
  366. local viewId=app.room:getViewIdByUserId(data.nUserId)
  367. self.playerHandCards[viewId]:hideOperate()
  368. if viewId==MJDefine.MyViewId then
  369. -- self.playerHandCards[MJDefine.MyViewId].touchMJ=self.playerHandCards[MJDefine.MyViewId]:getMjByValue(data.card)
  370. end
  371. self:onOutCardSuccess({response=response})
  372. end
  373. function huamajiangRoomReplayView:onBaoPaiRes(data)
  374. local response={
  375. nUserId=data.nUserId,
  376. isBaoPai=data.card,
  377. }
  378. local viewId=app.room:getViewIdByUserId(data.nUserId)
  379. self.playerHandCards[viewId]:hideOperate()
  380. self:onBaoPai({response=response})
  381. end
  382. function huamajiangRoomReplayView:onPiaoRes(data)
  383. local response={
  384. nUserId=data.nUserId,
  385. piaostate=data.piaostate,
  386. }
  387. local viewId=app.room:getViewIdByUserId(data.nUserId)
  388. self.playerHandCards[viewId]:hideOperate()
  389. self:onPiaoResponse({response=response})
  390. local viewId = app.room:getViewIdByUserId(data.nUserId)
  391. local ui=loadUI("mj_huamajiang/res/ui_fangjian/mj_huamajiang_replay_piao.ui")
  392. local pos = self.playerHandCards[viewId]:getAnimationPostion()
  393. ui:setPosition(pos)
  394. self.ui.Items.Layout_Effect_luobo:addChild(ui)
  395. local btn
  396. if tonumber(data.piaostate) == 1 then
  397. btn = ui.Items.Button_Piao
  398. elseif tonumber(data.piaostate) == 0 then
  399. btn = ui.Items.Button_BuPiao
  400. end
  401. if btn then
  402. local hand = cc.Sprite:create("mj/res/ui/zy_fangjian/mj_room_hand.png")
  403. btn:addChild(hand)
  404. local size = btn:getContentSize()
  405. hand:setPosition(cc.p(size.width/2+20,size.height/2-20))
  406. local action = cc.Sequence:create(cc.MoveBy:create(0.5,cc.p(-10,10)),cc.MoveBy:create(0.5,cc.p(10,-10)))
  407. hand:runAction(cc.RepeatForever:create(action))
  408. btn:runAction(cc.Sequence:create(cc.DelayTime:create(1),cc.CallFunc:create(function()
  409. ui:removeFromParent()
  410. ui = nil
  411. self.piaotimes = self.piaotimes - 1
  412. if self.piaotimes == 0 then--所有飘操作已经完成了,删除桌面上的飘字
  413. --清除桌面上的飘
  414. self.ui.Items.Layout_Effect_luobo:removeAllChildren()
  415. end
  416. end)))
  417. end
  418. end
  419. function huamajiangRoomReplayView:onDianPao(data)
  420. self.dpUserId = data.nUserId or 0
  421. --判断是否一炮多响,修复明杰大佬的BUG
  422. self.daPaoHaoShuang = false
  423. self.huIndex = 1
  424. -- if app.room.roomInfo.nMaxPlayCount == 3 and self.reports[self.reportIndex]
  425. -- and self.reports[self.reportIndex + 1].opType == "QiangGHu" and self.reports[self.reportIndex + 2].opType == "QiangGHu" then
  426. -- self.daPaoHaoShuang = true
  427. -- elseif app.room.roomInfo.nMaxPlayCount == 4 and self.reports[self.reportIndex]
  428. -- and self.reports[self.reportIndex + 1].opType == "QiangGHu" and self.reports[self.reportIndex + 2].opType == "QiangGHu"
  429. -- and self.reports[self.reportIndex + 3].opType == "QiangGHu" then
  430. -- self.daPaoHaoShuang = true
  431. -- elseif app.room.roomInfo.nMaxPlayCount == 4 and self.reports[self.reportIndex]
  432. -- and self.reports[self.reportIndex + 1].opType == "QiangGHu" and self.reports[self.reportIndex + 2].opType == "QiangGHu"
  433. -- then
  434. -- self.daPaoHaoShuang = true
  435. -- end
  436. if self.reports[self.reportIndex] and self.reports[self.reportIndex + 1] then
  437. if self.reports[self.reportIndex + 1].opType == "QiangGHu" then
  438. self.daPaoHaoShuang = true
  439. end
  440. end
  441. end
  442. function huamajiangRoomReplayView:onPlayerHu(data)
  443. local player = app.room.roomInfo.memberList[data.nUserId];
  444. local huCards = player.huCards or {};
  445. table.insert(huCards, data.card);
  446. local roomInfo=app.room.roomInfo
  447. self.huOrder = self.huOrder + 1
  448. local huType = {
  449. ["ZiMo"] = MJDefine.MJGameHuType.HU_ZIMO,
  450. ["PaoHu"] = MJDefine.MJGameHuType.HU_DIANPAO,
  451. ["QiangGHu"] = MJDefine.MJGameHuType.HU_DIANPAO,
  452. ["GangSH"] = MJDefine.MJGameHuType.HU_ZIMO,
  453. }
  454. local opType = {
  455. ["ZiMo"] = MJDefine.MJOperateType.OPREATE_ZIMOHU,
  456. ["PaoHu"] = MJDefine.MJOperateType.OPREATE_DIANPAOHU,
  457. ["QiangGHu"] = MJDefine.MJOperateType.OPREATE_QIANG_GANG_HU,
  458. ["GangSH"] = MJDefine.MJOperateType.OPREATE_ZIMOHU,
  459. }
  460. local redRealCard = 0
  461. local isQiangGng = 0
  462. if data.opType == "QiangGHu" then
  463. redRealCard = data.card
  464. isQiangGng =1
  465. end
  466. local tmp = {};
  467. for k, v in ipairs(huCards) do
  468. table.insert(tmp, {
  469. huCard = v,
  470. huType = huType[data.opType], -- 写死
  471. dpSeatId = app.room:getSeatIdByUserId(self.dpUserId), -- 写死
  472. });
  473. end
  474. player.huCards = tmp;
  475. local response={
  476. nUserId=data.nUserId,
  477. huType = huType[data.opType],
  478. huCard = {
  479. huCard = data.card,
  480. huType = huType,
  481. dpSeatId = app.room:getSeatIdByUserId(self.dpUserId),
  482. },
  483. opType = opType[data.opType],
  484. dpId = self.dpUserId,
  485. huOrder = self.huOrder,
  486. redRealCard = redRealCard,
  487. isQiangGng = isQiangGng,
  488. huIndex = self.huIndex,
  489. }
  490. self.huIndex = self.huIndex + 1
  491. local viewId=app.room:getViewIdByUserId(data.nUserId)
  492. for k,v in pairs(self.playerHandCards) do
  493. v:hideOperate()
  494. end
  495. self.playerHandCards[viewId]:hideOperate()
  496. response.isReplay = true;
  497. response.huRenShu = self.daPaoHaoShuang and 3 or 0;
  498. self:onHuResponse({response=response})
  499. self:updateScoreInfo(response.opType, data.card);
  500. end
  501. --出牌成功
  502. function huamajiangRoomReplayView:onOutCardSuccess(data)
  503. logE("huamajiangRoomReplayView:onOutCardSuccess(), response = ", table.tostring(data.response))
  504. --[[
  505. -- 出牌用户id
  506. , defVar("nOutCardUserId", VT_Int, -1)
  507. -- 出的牌
  508. , defVar("byOutCard", VT_UChar, -1)
  509. -- 可以的操作ma
  510. , defVar("mainOpCode", VT_Short, -1)
  511. -- 玩家操作
  512. , defVar("operations", VT_Vector(ChuPaiPlayerOperation), {})--]]
  513. local function runOnOutCardSuccess(onEnd)
  514. log("2000000000-huamajiangRoomReplayView - runOnOutCardSuccess---------")
  515. local viewId = app.room:getViewIdByUserId(data.response.nUserId)
  516. local card= data.response.card
  517. local operates=data.response.operates
  518. local typr = operates.opType
  519. if operates and table.nums(operates)>0 then
  520. self.operates = operates
  521. else
  522. self.operates = {}
  523. end
  524. local function callback()
  525. self.playerHandCards[MJDefine.MyViewId]:showOperate(operates,card)
  526. if onEnd then
  527. onEnd()
  528. end
  529. end
  530. -- self.lastOutCard = card
  531. self.lastOutViewId = viewId
  532. local player = app.room.roomInfo.memberList[data.response.nUserId]
  533. if self.playerHandCards[viewId] then --and (viewId~=MJDefine.MyViewId or player.isBaoPai == 1)
  534. self.playerHandCards[viewId]:onOutCard(card,callback)--onOutCard(data.response,true)
  535. app.room:dispatchEvent({name = MJDefine.MJEvent.OutCardFalg, value=card ,viewId=viewId})
  536. if viewId==MJDefine.MyViewId then
  537. self.playerHandCards[viewId]:setTing(false)
  538. end
  539. else
  540. callback()
  541. end
  542. end
  543. log("2000000000-huamajiangRoomReplayView - addCallBack(runOnOutCardSuccess)")
  544. self:addCallBack(runOnOutCardSuccess)
  545. end
  546. function huamajiangRoomReplayView:onHuanPaiType(data)
  547. self:showSwapDirection(data.huanPaiType)
  548. end
  549. --换牌完成
  550. function huamajiangRoomReplayView:onHuanPaiDone(data)
  551. if not data.huanPaiInfo or type(data.huanPaiInfo) ~= 'table' then return end
  552. for i,v in pairs(data.huanPaiInfo) do
  553. local viewId=app.room:getViewIdByUserId(v.nUserId)
  554. self.playerHandCards[viewId]:createSwapCards(v.cards)
  555. for i,v in pairs(v.cards) do
  556. self.playerHandCards[viewId]:onGetCard(nil,tonumber(v),true)
  557. end
  558. local action = cc.Sequence:create(cc.DelayTime:create(1),cc.CallFunc:create(function()
  559. self.playerHandCards[viewId]:deleteSwapCards()
  560. end))
  561. self.playerHandCards[viewId]:resetHandCards()
  562. self:runAction(action)
  563. end
  564. end
  565. --开始换牌
  566. function huamajiangRoomReplayView:onHuanPai(data)
  567. if not data.huanPaiInfo or type(data.huanPaiInfo) ~= 'table' then return end
  568. for i,v in pairs(data.huanPaiInfo) do
  569. local viewId=app.room:getViewIdByUserId(v.nUserId)
  570. self.playerHandCards[viewId]:createSwapCards(v.cards)
  571. local tselCards = {}
  572. for j,k in pairs(v.cards) do
  573. table.insert(tselCards,{card = k})
  574. end
  575. self.playerHandCards[viewId]:removeHandCard(tselCards)
  576. self.playerHandCards[viewId]:resetHandCards()
  577. local action = cc.Sequence:create(cc.DelayTime:create(1),cc.CallFunc:create(function()
  578. self.playerHandCards[viewId]:deleteSwapCards()
  579. end))
  580. self:runAction(action)
  581. end
  582. end
  583. function huamajiangRoomReplayView:onGameEnd(data)
  584. local function runGameXiaoJuResponse(onEnd)
  585. local function callback()
  586. --self:endReplay()
  587. --:showXiaoJuView()
  588. if onEnd then
  589. onEnd()
  590. end
  591. end
  592. local roomInfo = app.room.roomInfo
  593. local hutype=self.data.ext.huTypes
  594. local hucard=data.card
  595. self.direcionView:stopAllActions()
  596. -- local resultInfo=json.decode(roomInfo.strResultInfo)
  597. --所有胡牌的人 考虑抢杠胡的问题
  598. --所有胡牌的人 考虑抢杠胡的问题
  599. local viewIds={}
  600. local failViewId=0
  601. for k,v in pairs(roomInfo.memberList) do
  602. local viewId = app.room:getViewIdByUserId(v.nUserId)
  603. if v.result==MJDefine.MJGameResultType.Win then
  604. table.insert(viewIds,viewId)
  605. --处理掉huCard, 不加入手牌
  606. --播放音效
  607. if viewId==MJDefine.MyViewId then
  608. MJSound.PlayWinGame()
  609. end
  610. elseif v.result==MJDefine.MJGameResultType.Fail then
  611. failViewId=viewId
  612. if viewId==MJDefine.MyViewId then
  613. MJSound.PlayLoseGame()
  614. end
  615. end
  616. end
  617. self:showOpenCard()
  618. local function callback()
  619. self:showXiaoJuView()
  620. if onEnd then
  621. onEnd()
  622. end
  623. end
  624. if #viewIds>0 then
  625. for k,viewId in pairs(viewIds) do
  626. local effect
  627. local resultInfo = roomInfo:getResultInfos();
  628. local userId = app.room:getUserIdByViewId(viewId)
  629. if k == #viewIds then --只有最后播放胡牌动画的回调一次就可以了
  630. if resultInfo[userId].result == MJDefine.MJGameHuType.HU_ZIMO then
  631. effect = MJAnimationCompnent.CreateHuEffect("zimo",callback)
  632. else
  633. effect = MJAnimationCompnent.CreateHuEffect("hu",callback)
  634. end
  635. else
  636. end
  637. if effect then
  638. self:addChild(effect)
  639. effect:setPosition(self.playerHandCards[viewId]:getAnimationPostion())
  640. effect:setVisible(false)
  641. end
  642. end
  643. else
  644. if roomInfo:getStopFlag() == MJDefine.StopFlag.STOP_FLAG_HUANG_ZHUANG then
  645. local effect=MJAnimationCompnent.CreateLiuJuEffect(callback)
  646. self:addChild(effect)
  647. else
  648. callback()
  649. end
  650. end
  651. end
  652. log("2000000000-MJRoomView - addCallBack(runGameXiaoJuResponse)" )
  653. self:addCallBack(runGameXiaoJuResponse);
  654. end
  655. function huamajiangRoomReplayView:onEventBtnShowFlowViewClicked ()
  656. local ext = self.data.ext or {};
  657. local response = {};
  658. local roomInfo = app.room.roomInfo;
  659. local luoboCards = roomInfo:getLuoBoCards();
  660. response.luoboCards = roomInfo:getLuoBoCardsSummary(luoboCards);
  661. local scoreInfo = roomInfo:getScoreInfo();
  662. response.detail = scoreInfo;
  663. response.isReplay = true;
  664. huamajiangRoomReplayView.super.onEventBtnShowFlowViewClicked(self, {response = response});
  665. end
  666. function huamajiangRoomReplayView:setButtonTingInfoVisible ()
  667. huamajiangRoomReplayView.super.setButtonTingInfoVisible(self, false);
  668. end
  669. function huamajiangRoomReplayView:updateScoreInfo(opType, opCard)
  670. logD("huamajiangRoomReplayView:updateScoreInfo", opType, opCard)
  671. if not (self.scoreInfo and #self.scoreInfo> 0) then return end
  672. for index = self.scoreIndex or 1, #self.scoreInfo do
  673. local info = self.scoreInfo[index];
  674. if info.ot == opType and info.oc == opCard then
  675. local scoreInfo = app.room.roomInfo:getScoreInfo();
  676. table.insert(scoreInfo, info);
  677. app.room.roomInfo:setScoreInfo(scoreInfo);
  678. self.scoreIndex = index;
  679. break;
  680. end
  681. end
  682. end
  683. --播放一条战报
  684. function huamajiangRoomReplayView:playNextReport()
  685. huamajiangRoomReplayView.super.playNextReport(self);
  686. if self.reportIndex > #self.reports then
  687. if self.reportIndex >= #self.reports + 1 then--防止最后一步没有播放
  688. self:stopAllActions()
  689. end
  690. self.scoreIndex = #self.scoreInfo
  691. app.room.roomInfo:setScoreInfo(self.scoreInfo);
  692. end
  693. end
  694. return huamajiangRoomReplayView