選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

1657 行
48 KiB

  1. -- xx : 2018/5/7
  2. -- 跑得快回放界面
  3. local PdkDef = require("luaScript.SubGameDefine.Poker.luzhouPdkWanFa")
  4. local PdkPlayerNode = require("pk_luzhoupdk.luaScript.Views.Room.Node.luzhouPdkPlayerNode")
  5. local PdkCardNode = require("pk_luzhoupdk.luaScript.Views.Room.Node.luzhouPdkCardNode")
  6. local PdkRoomViewConfig = require("pk_luzhoupdk.luaScript.Views.Room.luzhouPdkRoomViewConfig")
  7. local PdkEffectHelper = require("pk_luzhoupdk.luaScript.Views.Room.luzhouPdkEffectHelper"):new()
  8. local ETS = PdkRoomViewConfig.EffectType
  9. local PdkSoundHelper = require("pk_luzhoupdk.luaScript.Views.Room.luzhouPdkSoundHelper"):new()
  10. require("luaScript.Views.Room.RoomFunctions")
  11. local CENTER_X=640*g_radio_x
  12. local CENTER_Y=360*g_radio_y
  13. -- 表ta中是否包含元素x
  14. local function ownX( ta, x )
  15. local rst = false
  16. for _,v in ipairs(ta) do
  17. if tonumber(v) == tonumber(x) then
  18. rst = true
  19. break
  20. end
  21. end
  22. return rst
  23. end
  24. -- 获取ta表中移除tb表的结果
  25. local function getDelAdB( ta, tb )
  26. -- print("------------------getDelAdB---------------------------")
  27. -- print("----ta: ", table.concat(ta, "_"))
  28. -- print("----tb: ", table.concat(tb, "_"))
  29. local tmp = {}
  30. for _,v in ipairs(ta) do
  31. if not ownX(tb, v) then
  32. table.insert(tmp, v)
  33. end
  34. end
  35. -- print("----tmp: ", table.concat(tmp, "_"))
  36. -- print("------------------------------------------------------")
  37. return tmp
  38. end
  39. --[[
  40. PASS = 0,--要不起
  41. SINGLE_CARD = 1, --//单牌
  42. DUI_ZI = 2, --//对子
  43. THREE = 3, --三个
  44. THREE_AND_TWO = 4, --//三带二张
  45. THREE_AND_DUI = 5, --//三带一对
  46. SHUN_ZI = 6, --//顺子
  47. LIAN_DUI = 7, --//连对(至少2连对)
  48. AIRPLANE = 8, --//飞机
  49. AIRPLANE_TOW = 9, --//飞机带散牌
  50. AIRPLANE_DUI = 10, --//飞机带对
  51. BOMB = 11, --//炸弹
  52. NONE = 100, --不适用类型
  53. ]]
  54. local OP_TYPE_STRING_NO = {
  55. single_card = ETS.SINGLE_CARD,
  56. three_and_two = ETS.THREE_AND_TWO,
  57. dui_zi = ETS.DUI_ZI,
  58. lian_dui = ETS.LIAN_DUI,
  59. airplane = ETS.AIRPLANE,
  60. shun_zi = ETS.SHUN_ZI,
  61. bomb = ETS.BOMB,
  62. four_and_three = ETS.FOUR_AND_THREE,
  63. }
  64. --------------------------------------------------------------------------------------------------------------------------------------------
  65. --------------------------------------------------------------------------------------------------------------------------------------------
  66. --------------------------------------------------------------------------------------------------------------------------------------------
  67. --------------------------------------------------------------------------------------------------------------------------------------------
  68. --------------------------------------------------------------------------------------------------------------------------------------------
  69. --------------------------------------------------------------------------------------------------------------------------------------------
  70. local PRoom = class("PdkRoomPlay")
  71. function PRoom:ctor( )
  72. -- 玩家信息
  73. self._players = {}
  74. -- 房间信息
  75. self.roomInfo = {}
  76. end
  77. -- 添加玩家,如果玩家存在则更新数据
  78. -- key - value 缓存
  79. function PRoom:addPlayer( pl )--and update
  80. self._players = self._players or {}
  81. local player = self._players[tostring(pl.userId)]
  82. if player then
  83. for k,v in pairs(pl) do
  84. player[k] = v
  85. end
  86. else
  87. self._players[tostring(pl.userId)] = pl
  88. end
  89. end
  90. -- 删除玩家
  91. function PRoom:delPlayer( uid )
  92. local player = self._players[tostring(uid)]
  93. if player then
  94. self._players[tostring(uid)] = nil
  95. end
  96. end
  97. -- 获取玩家
  98. function PRoom:getPlayer( uid )
  99. local player = self._players[tostring(uid)]
  100. return player
  101. end
  102. -- 根据座位号获取玩家数据
  103. function PRoom:getPlayerCid( cid )
  104. for _,v in pairs(self._players) do
  105. if v.seatId == cid then
  106. return v
  107. end
  108. end
  109. return nil
  110. end
  111. -- 根据视角获取玩家数据
  112. function PRoom:getPlayerVpos( viewPos )
  113. for _,v in pairs(self._players) do
  114. if v.viewPos == viewPos then
  115. return v
  116. end
  117. end
  118. return nil
  119. end
  120. -- 获取所有玩家
  121. function PRoom:getPlayers()
  122. return self._players or {}
  123. end
  124. -- 获取玩家数量
  125. function PRoom:getPlayerNum()
  126. local count = 0
  127. for _,_ in pairs(self._players) do
  128. count = count + 1
  129. end
  130. return count
  131. end
  132. -- 根据id判断是否是自己
  133. function PRoom:isMyself( uid )
  134. return tonumber(app.user.loginInfo.uid) == tonumber(uid)
  135. end
  136. -- 获取自己信息
  137. function PRoom:getMyself()
  138. return self._players[tostring(app.user.loginInfo.uid)] or self._players[tostring(app.firstRecordUid)]
  139. end
  140. -- 视角转换
  141. function PRoom:transPos( pos )
  142. local myself = self:getMyself()
  143. local MaxCount = self:getRoomInfo().nMaxPlayCount
  144. local showPos = 0
  145. local myPos = myself.seatId
  146. if myPos <= pos then
  147. showPos = pos - myPos
  148. elseif myPos > pos then
  149. showPos = MaxCount - myPos + pos
  150. end
  151. return showPos+1
  152. end
  153. -- 获取房间信息
  154. function PRoom:getRoomInfo()
  155. return self.roomInfo
  156. end
  157. -- 缓存房间信息
  158. function PRoom:setRoomInfo( roominfo )
  159. self.roomInfo = self.roomInfo or {}
  160. for k,v in pairs(roominfo) do
  161. self.roomInfo[k] = v
  162. end
  163. end
  164. -- 获取下一个轮次
  165. function PRoom:getNextTurn(viewPos)
  166. local MaxCount = self:getRoomInfo().nMaxPlayCount
  167. if MaxCount == 4 then
  168. if viewPos == 4 then
  169. return 1
  170. else
  171. return viewPos+1
  172. end
  173. elseif MaxCount == 3 then
  174. if viewPos == 3 then
  175. return 1
  176. else
  177. return viewPos+1
  178. end
  179. else
  180. if viewPos == 2 then
  181. return 1
  182. else
  183. return viewPos+1
  184. end
  185. end
  186. --return (viewPos+1)%MaxCount==0 and MaxCount or (viewPos+1)%MaxCount
  187. end
  188. --------------------------------------------------------------------------------------------------------------------------------------------
  189. --------------------------------------------------------------------------------------------------------------------------------------------
  190. --------------------------------------------------------------------------------------------------------------------------------------------
  191. --------------------------------------------------------------------------------------------------------------------------------------------
  192. --------------------------------------------------------------------------------------------------------------------------------------------
  193. --------------------------------------------------------------------------------------------------------------------------------------------
  194. local PdkRoomView = class("PdkRoomView", cc.UIView)
  195. function PdkRoomView:ctor(recordData)
  196. PdkRoomView.super.ctor(self)
  197. self._recordData = recordData
  198. --房间信息
  199. self.roomInfo = {}
  200. -- 玩家节点
  201. self._playerNodes = {}
  202. -- 自己手牌集合
  203. self._selfCards = {}
  204. -- 玩家手牌集合
  205. self._otherCards = {{}, {}, {}, {}}
  206. -- 玩家出牌集合
  207. self._showCards = {{},{},{},{}}
  208. -- 上一次出牌viewPos
  209. self._lastOutPos = 0
  210. -- 上一次出牌类型
  211. self._lastOutType = 0
  212. -- 上一次出牌,用于提示
  213. self._lastCards = {}
  214. -- 排序轮次用
  215. self._turnsQueue = {}
  216. -- 是否开始播放
  217. self._playStart = false
  218. -- 数据备份,以便重复播放
  219. self._backupData = nil
  220. -- 是否已经最后展示
  221. self._gameResult = nil
  222. -- 本轮所有操作次数
  223. self._allOps = 0
  224. -- 当前所剩操作数
  225. self._leftOps = 0
  226. -- 结算数据
  227. self._resultData = nil
  228. -- 房间缓存
  229. self._room = PRoom:new()
  230. self:parseData(self._recordData)
  231. self.ui = loadUI("pk_luzhoupdk/res/ui/ui_room/ui_lzpdk_recordplayview.ui")
  232. self:addChild(self.ui)
  233. loadSpriteFrameFile("pk_luzhoupdk/res/ui/zy_game/lzroom_add.plist")
  234. self:initUi()
  235. self.roomInfo = self._room:getRoomInfo()
  236. self:setRoomInfo(self.roomInfo)
  237. loadSpriteFrameFile("pk_luzhoupdk/res/ui/zy_game/zy_lzpdk_cards.plist")
  238. loadSpriteFrameFile("pk_luzhoupdk/res/ui/zy_effect/lzpdk_effect.plist")
  239. loadSpriteFrameFile("pk_luzhoupdk/res/ui/zy_effect/lzpdk_effect_bomb.plist")
  240. loadSpriteFrameFile("pk_luzhoupdk/res/ui/zy_effect/lzpdk_effect_shunziliandui.plist")
  241. loadSpriteFrameFile("pk_luzhoupdk/res/ui/zy_effect/lzpdk_effect_plan.plist")
  242. --
  243. local rule = self.roomInfo.specialRule
  244. -- 是否选择三不带全
  245. self.ruleIsNotEnough = true--getNumBand(rule, 0x0008)>0
  246. -- 炸弹可拆
  247. self.ruleIsChaiBomb = getNumBand(rule, 0x0004)>0
  248. -- 是否选择4带3
  249. self.ruleIsFAT = getNumBand(rule, 0x0002)>0
  250. -- 玩法模式 经典 15张
  251. self.ruleType = self.roomInfo.gamerule
  252. -- 是否选择扎鸟
  253. self.ruleZhaniao = getNumBand(rule, 0x0001)>0
  254. end
  255. --[[
  256. "recordData" = {
  257. "dipai" = ""
  258. "endtime" = 1525689769
  259. "ext" = {
  260. "banker" = "1025568"
  261. "clubId" = 206231
  262. "deductRule" = 0
  263. "gamerule" = 1
  264. "playerNum" = 1
  265. "specialRule" = 65
  266. "tableIdx" = 1
  267. }
  268. "flag" = 0
  269. "gameid" = 9
  270. "idx" = 1
  271. "ops" = "1025568,outCard:{ 0x21 0x31 },handType: dui_zi|1024796,outCard:{ 0x03 0x33 },handType: dui_zi|1024798,outCard:{ 0x05 0x25 },handType: dui_zi|1025568,outCard:{ 0x26 0x36 },handType: dui_zi|1024796,outCard:{ 0x28 0x38 },handType: dui_zi|1025568,outCard:{ 0x1c 0x3c },handType: dui_zi|1025568,outCard:{ 0x15 0x19 0x29 0x09 0x2a },handType: three_and_two|1024796,outCard:{ 0x11 0x14 0x3b 0x1b 0x2b },handType: three_and_two|1024796,outCard:{ 0x02 0x12 0x32 0x35 0x0d },handType: three_and_two|1024796,outCard:{ 0x0a 0x3a },handType: dui_zi"
  272. "pid" = "2568504031125505"
  273. "score" = {
  274. "1024796" = 33
  275. "1024798" = -28
  276. "1025568" = -5
  277. }
  278. "subid" = "2550911843082241"
  279. "turn" = 1
  280. "user" = {
  281. "1024796" = {
  282. "hand" = "0x0d 0x1b 0x2b 0x3b 0x0a 0x3a 0x28 0x38 0x35 0x14 0x03 0x33 0x02 0x12 0x32 0x11"
  283. "seatid" = 1
  284. }
  285. "1024798" = {
  286. "hand" = "0x2c 0x1a 0x39 0x08 0x18 0x07 0x27 0x06 0x16 0x05 0x25 0x34 0x13 0x23 0x22 0x01"
  287. "seatid" = 2
  288. }
  289. "1025568" = {
  290. "hand" = "0x1c 0x3c 0x0b 0x2a 0x09 0x19 0x29 0x17 0x37 0x26 0x36 0x15 0x04 0x24 0x21 0x31"
  291. "seatid" = 0
  292. }
  293. }
  294. }
  295. "playerInfo" = {
  296. "head" = "http://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTK9s9890abV3nHDBgZFOXuO3eAoCs2SsuFFbp0NUzChuCM4wAEUf02IQI7TYW8gelo75fTxKRQdDA/132"
  297. "name" = "名52688"
  298. "sex" = 1
  299. }
  300. ]]
  301. function PdkRoomView:parseData( data )
  302. local roomInfo = {}
  303. roomInfo.nTableId = data.roomid
  304. roomInfo.clubId = data.ext.clubId
  305. roomInfo.banker = data.ext.banker--庄家
  306. roomInfo.gamerule = data.ext.gamerule -- 1 经典16张 2 15张玩法
  307. roomInfo.playnum = data.ext.playnum --0 两人 1 三人
  308. roomInfo.specialRule = data.ext.specialRule
  309. roomInfo.tableIdx = data.ext.tableIdx
  310. roomInfo.allowPass = data.ext.allowPass
  311. roomInfo.nGameStartCount = data.turn
  312. roomInfo.nTotalGameNum = data.nbound----------------------------
  313. roomInfo.deductRule = data.ext.deductRule
  314. roomInfo.endtime = data.endtime
  315. roomInfo.nMaxPlayCount = 0
  316. if roomInfo.playnum==1 then
  317. roomInfo.nMaxPlayCount = 4
  318. else
  319. roomInfo.nMaxPlayCount = roomInfo.playnum
  320. end
  321. for k,v in pairs(data.user) do
  322. local user = {}
  323. user.userId = tonumber(k)
  324. user.seatId = v.seatid
  325. local cstr = string.split(v.hand, " ")
  326. user.handCards = {}
  327. for _,v in ipairs(cstr) do
  328. if string.len(v) > 0 then
  329. table.insert(user.handCards, tonumber(v))
  330. end
  331. end
  332. user.leftCards = clone(user.handCards)
  333. user.leftNum = #user.handCards
  334. local oinfo = app.playerInfoManager:getPlayerInfo(tonumber(k))
  335. if oinfo then
  336. user.headimgurl = oinfo.head
  337. user.sex = oinfo.sex
  338. user.nickname = oinfo.name
  339. end
  340. self._room:addPlayer(user)
  341. end
  342. roomInfo.nMaxPlayCount = table.nums(data.user)
  343. self._room:setRoomInfo(roomInfo)
  344. local firstId = false
  345. app.firstRecordUid = 0
  346. for k,v in pairs(data.user) do
  347. local user = {}
  348. user.userId = tonumber(k)
  349. if not firstId then
  350. app.firstRecordUid = user.userId--找到一个uid代替自己的uid,防止没有参加游戏的人看回放了报错
  351. firstId = true
  352. end
  353. user.viewPos = self._room:transPos(v.seatid)
  354. user.score = data.score[k]
  355. self._room:addPlayer(user)
  356. end
  357. if string.len(data.ops) <=0 then --没开始,提前解散
  358. -- result data
  359. local result = {}
  360. local players = self._room:getPlayers()
  361. local pt = {}
  362. for k,v in pairs(players) do
  363. local d = {}
  364. d.userId = tonumber(k)
  365. d.leftCards = clone(v.leftCards)
  366. d.totalScore = v.score
  367. d.sex = v.sex
  368. d.headimgurl = v.headimgurl
  369. d.nickname = v.nickname
  370. table.insert(pt, d)
  371. end
  372. result.players = pt
  373. self._resultData = {response=result}
  374. return
  375. end
  376. --op data
  377. local opStrST = string.split(data.ops, "|")--1025568,outCard:{ 0x21 0x31 },handType: dui_zi
  378. for _,opstr in ipairs(opStrST) do
  379. local opT = string.split(opstr, ",")
  380. local uid = opT[1]
  381. local cardstr = string.gsub(opT[2], "outCard:{ ", "")
  382. cardstr = string.gsub(cardstr, " }", "")
  383. local cardstrT = string.split(cardstr, " ")
  384. local cards = {}
  385. for _,cid in ipairs(cardstrT) do
  386. table.insert(cards, tonumber(cid))
  387. end
  388. local opstr = string.gsub(opT[3], "handType:", "")
  389. local opType = tonumber(opstr) or 0
  390. --
  391. local user = self._room:getPlayer(uid)
  392. if user then
  393. local pdata = {}
  394. pdata.userId = tonumber(uid)
  395. pdata.viewPos = user.viewPos
  396. pdata.seatId = user.seatId
  397. pdata.cards = cards
  398. pdata.opType = opType
  399. pdata.leftNum = user.leftNum-#cards
  400. local tmpLeft = getDelAdB(user.leftCards, cards)
  401. user.leftCards = clone(tmpLeft)
  402. user.leftNum = #tmpLeft
  403. self._room:addPlayer(user)
  404. local preData = self:getTurnLast()
  405. if preData then
  406. local preViewPos = preData.viewPos
  407. local nextTurn = self._room:getNextTurn(preViewPos)
  408. if nextTurn==pdata.viewPos then
  409. self:addTurnData(pdata)
  410. else--添加要不起
  411. while nextTurn~=pdata.viewPos do
  412. preData = self:getTurnLast()
  413. if preData then
  414. preViewPos = preData.viewPos
  415. nextTurn = self._room:getNextTurn(preViewPos)
  416. local player = self._room:getPlayerVpos(nextTurn)
  417. local passData = {}
  418. passData.userId = tonumber(player.userId)
  419. passData.viewPos = nextTurn
  420. passData.seatId = player.seatId
  421. passData.cards = {}
  422. passData.opType = 0
  423. passData.leftNum = player.leftNum
  424. self:addTurnData(passData)
  425. nextTurn = self._room:getNextTurn(nextTurn)
  426. else
  427. break
  428. end
  429. end
  430. self:addTurnData(pdata)
  431. end
  432. else
  433. self:addTurnData(pdata)
  434. end
  435. end
  436. end
  437. -- result data
  438. local result = {}
  439. local players = self._room:getPlayers()
  440. local pt = {}
  441. for k,v in pairs(players) do
  442. local d = {}
  443. d.userId = tonumber(k)
  444. d.leftCards = clone(v.leftCards)
  445. d.totalScore = v.score
  446. d.sex = v.sex
  447. d.headimgurl = v.headimgurl
  448. d.nickname = v.nickname
  449. table.insert(pt, d)
  450. end
  451. result.players = pt
  452. self._resultData = {response=result}
  453. -- 数据备份
  454. self._backupData = clone(self._turnsQueue)
  455. -- 总步骤
  456. self._allOps = #self._turnsQueue
  457. end
  458. function PdkRoomView:resetRoundData()
  459. -- 上一次出牌viewPos
  460. self._lastOutPos = 0
  461. -- 上一次出牌类型
  462. self._lastOutType = 0
  463. self._lastCards = {}
  464. self.lastOutFlag = -1
  465. self:cleanSelfCards()
  466. self:cleanShowCards()
  467. self:stopTurn()
  468. self:showOtherCards(false)
  469. -- 清空玩家时钟
  470. for _,v in pairs(self._playerNodes) do
  471. v:setTurn(false)
  472. end
  473. end
  474. function PdkRoomView:getMode()
  475. return self._room:getRoomInfo().nMaxPlayCount or 4
  476. --[[local roomInfo = self._room:getRoomInfo()
  477. if roomInfo.nMaxPlayCount == 2 then
  478. return 0
  479. elseif roomInfo.nMaxPlayCount == 3 then
  480. return 1
  481. end
  482. return 1--]]
  483. end
  484. function PdkRoomView:initUi()
  485. self.cardRoot = self.ui.Items.cardRoot
  486. self.imgOtherCards = self.ui.Items.ImageView_other
  487. self.txtOtherCards = self.ui.Items.Text_otherNum
  488. self:showOtherCards(false)
  489. self.ui.Items.toolPanel:setLocalZOrder(101)
  490. self.ui.Items.btnReturn:registerClick(handler(self , self.onClickButtonReturn))
  491. self.ui.Items.btnPlay:registerClick(handler(self , self.onClickButtonPlay))
  492. self.ui.Items.ButtonToward:registerClick(handler(self , self.onClickButtonToward))
  493. self.ui.Items.btnDetail:registerClick(handler(self , self.onClickButtonDetails))
  494. self.ui.Items.btnDetail:setVisible(false)
  495. self.ui.Items.imgTip:setVisible(false)
  496. self.ui.Items.imgTip:setOpacity(0)
  497. self.ui.Items.imgTip:setLocalZOrder(200)
  498. --添加玩家节点
  499. local players = self._room:getPlayers()
  500. for _, info in pairs(players) do
  501. self:addPlayerNode( info )
  502. end
  503. end
  504. function PdkRoomView:updateProgress()
  505. local over = 0
  506. local overOps = self._allOps - self._leftOps
  507. -- local percent = math.floor((overOps/self._allOps)*100)
  508. self.ui.Items.Text_jindu:setString(string.format("进度:%d/%d", overOps, self._allOps))
  509. if overOps==self._allOps then
  510. showTooltip("回放结束")
  511. end
  512. end
  513. function PdkRoomView:onClickButtonPlay( sender, flag )
  514. if flag ~= 1 then
  515. playBtnEffect()
  516. end
  517. if sender.play == nil then
  518. sender.play = false
  519. end
  520. if sender.play then
  521. sender.play = false
  522. sender:loadTextureNormal("record_play.png", 1)
  523. self:stopTurn(false)
  524. else
  525. sender.play = true
  526. sender:loadTextureNormal("record_pause.png", 1)
  527. if self._gameResult == true then
  528. self:resetRoundData()
  529. self._turnsQueue = clone(self._backupData)
  530. end
  531. if self._playStart==true then
  532. self:stopTurn(false)
  533. self:startTurns()
  534. else
  535. local myself = self._room:getMyself()
  536. if myself then
  537. local data = {}
  538. data.response = {}
  539. data.response.cards = myself.handCards
  540. local playerCards = {}
  541. local players = self._room:getPlayers()
  542. for _,v in pairs(players) do
  543. playerCards[v.viewPos] = clone(v.handCards)
  544. end
  545. data.response.playerCards = playerCards
  546. local banker = self._room:getPlayer(self._room:getRoomInfo().banker)
  547. data.response.bankerSeat = banker.seatId
  548. self:onResponseSendCards(data)
  549. self.ui:runDelay(2.5, function() self:startTurns() end )
  550. end
  551. end
  552. end
  553. end
  554. function PdkRoomView:onClickButtonToward( sender )
  555. playBtnEffect()
  556. if self.ui.Items.btnPlay.play == nil then
  557. return
  558. end
  559. self.ui.Items.btnPlay.play = true
  560. self:onClickButtonPlay( self.ui.Items.btnPlay )
  561. local data = self:getTurnData()
  562. if data then
  563. self:updateTurns(data)
  564. else
  565. self:onResponseGameResult(self._resultData)
  566. end
  567. self._leftOps = #self._turnsQueue
  568. -- show
  569. self:updateProgress()
  570. self:stopTurn(false)
  571. end
  572. -- 玩家点击房间详情
  573. function PdkRoomView:onClickButtonDetails( sender )
  574. playBtnEffect()
  575. local node = self.ui.Items.btnDetail:getChildByTag(101)
  576. if node then
  577. else
  578. local rule = self:getRuleString()
  579. local view = import("pk_luzhoupdk.luaScript.Views.Room.Sub.luzhouPdkGameDetailView"):new(rule)
  580. view:setPosition(cc.p(view:getSizeWidth()+60, 60))
  581. view:setTag(101)
  582. self.ui.Items.btnDetail:addChild(view)
  583. end
  584. end
  585. function PdkRoomView:onClickButtonReturn( sender )
  586. playBtnEffect()
  587. self:removeFromParent()
  588. end
  589. --[[获取房间详情字符串--]]
  590. function PdkRoomView:getRuleString()
  591. local rule = self.roomInfo.specialRule
  592. local ruleStr = ""
  593. ruleStr = ruleStr..PdkRoomViewConfig.RoonInfoConfig.play[tonumber(self.roomInfo.gamerule)]..","
  594. ruleStr = ruleStr..PdkRoomViewConfig.RoonInfoConfig.num[tonumber(self.roomInfo.playnum)]..","
  595. if getNumBand(rule, 0x0001)>0 then
  596. ruleStr = ruleStr..PdkRoomViewConfig.CreateParamsMean[0x0001]..","
  597. end
  598. if getNumBand(rule, 0x0002)>0 then
  599. ruleStr = ruleStr..PdkRoomViewConfig.CreateParamsMean[0x0002]..","
  600. end
  601. -- if getNumBand(rule, 0x0008)>0 then
  602. -- -- ruleStr = ruleStr..PdkRoomViewConfig.CreateParamsMean[0x0008]..","
  603. -- end
  604. if string.len(ruleStr) > 0 then
  605. ruleStr = string.sub(ruleStr, 1, string.len(ruleStr)-1)
  606. end
  607. return ruleStr
  608. end
  609. -- 设置房间信息
  610. function PdkRoomView:setRoomInfo( info )
  611. self.ui.Items.roomNum:setString(string.format("房号:%06d", info.nTableId))
  612. end
  613. -- 显示轮次
  614. function PdkRoomView:showTurnBtn( is )
  615. if is then --回放出牌
  616. end
  617. end
  618. -- 一键截屏
  619. function PdkRoomView:onClickButtonShot( sender )
  620. playBtnEffect()
  621. showScreenShot()
  622. end
  623. -- 设置点击
  624. function PdkRoomView:onClickButtonSetting( sender )
  625. playBtnEffect()
  626. self:showMenu(false)
  627. local view = import("pk_luzhoupdk.luaScript.Views.Room.Sub.luzhouPdkSettingView"):new()
  628. view:setAnchorPoint(cc.p(0.5, 0.5))
  629. app:showWaitDialog(view)
  630. end
  631. -- 上传日志点击
  632. function PdkRoomView:onClickButtonUlog( sender )
  633. playBtnEffect()
  634. self:showMenu(false)
  635. local view = import("luaScript.Views.Room.UplogView"):new()
  636. view:setAnchorPoint(cc.p(0.5, 0.5))
  637. app:showWaitDialog(view)
  638. end
  639. -- 变暗不能出的牌
  640. function PdkRoomView:downCanotOuts(canotOuts, isTouch)
  641. for _,v in pairs(canotOuts) do
  642. local node = self:getCardNode(v)
  643. if node then node:setNoTouch(isTouch) end
  644. end
  645. end
  646. function PdkRoomView:bindEvents()
  647. -- 游戏设置里更换桌面
  648. -- self:bindEvent(app.room , "pdkNormalEvent_changeDesktop" , handler(self , self.onNormalChangeDesktop))
  649. end
  650. -- 更换桌面
  651. function PdkRoomView:onNormalChangeDesktop( data )
  652. --if data.idx >5 and data.idx<1 then return end
  653. local changeDesk = tonumber(loadUserInfo("lzpdk_setting_bg_idx")) or 2
  654. self.ui.Items.ImageView_bg:loadTexture(string.format("pk_luzhoupdk/res/ui/zy_game/lzpdk_gamebg_%d.jpg", changeDesk), 0)
  655. end
  656. -- 通知玩家分数
  657. function PdkRoomView:onResponseUpdateScore( data )
  658. local msg = data.response
  659. for _,pdata in ipairs(msg.players) do
  660. local node = self:getPlayerNode(pdata.userId)
  661. if node then node:setScore(pdata.totalScore) end
  662. end
  663. end
  664. -- 给玩家发牌
  665. function PdkRoomView:onResponseSendCards( data )
  666. self._leftOps = self._allOps
  667. self:updateProgress()
  668. self:cleanOtherHands()
  669. self._gameResult = false
  670. self._passGameResult = nil
  671. self._playStart = true
  672. self.ui.Items.ButtonToward:setEnabled(false)
  673. for viewPos,v in pairs(data.response.playerCards) do
  674. self:sendCards(v, viewPos)
  675. end
  676. local bankerData = self._room:getPlayerCid(data.response.bankerSeat)
  677. for _,v in pairs( self._playerNodes ) do
  678. v:setBanker(v:getInfo().userId==bankerData.userId)
  679. v:setTurn(false)
  680. v:setScore(0)
  681. end
  682. if self._room:isMyself(bankerData.userId) then
  683. self:runAction(cc.Sequence:create(cc.DelayTime:create(1), cc.CallFunc:create(function ()
  684. self:showTurnBtn(true)
  685. local node = self:getPlayerNodeVpos(1)
  686. if node then node:setTurn(true) end
  687. end)))
  688. else
  689. self:showTurnBtn(false)
  690. self:runAction(cc.Sequence:create(cc.DelayTime:create(1), cc.CallFunc:create(function ()
  691. local node = self:getPlayerNode(bankerData.userId)
  692. if node then node:setTurn(true) end
  693. end)))
  694. end
  695. -- 发完牌后显示牌张数
  696. self.ui:runDelay(2, function ()
  697. local left = 13
  698. --if self.ruleType==2 then left = 15 end
  699. for uid,v in pairs(self._playerNodes) do
  700. v:showLeft(left)
  701. self.ui.Items.ButtonToward:setEnabled(true)
  702. end
  703. end)
  704. end
  705. -- 将回放数据按照先后顺序处理成串行以便调度器调用
  706. function PdkRoomView:addTurnData( data )
  707. table.insert(self._turnsQueue, data)
  708. end
  709. function PdkRoomView:getTurnData( isRemove )
  710. local data = nil
  711. if #self._turnsQueue > 0 then
  712. data = clone(self._turnsQueue[1])
  713. if isRemove==nil then
  714. table.remove(self._turnsQueue, 1)
  715. end
  716. end
  717. return data
  718. end
  719. function PdkRoomView:getTurnLast()
  720. local data = nil
  721. if #self._turnsQueue > 0 then
  722. data = clone(self._turnsQueue[#self._turnsQueue])
  723. end
  724. return data
  725. end
  726. function PdkRoomView:startTurns()
  727. local data = self:getTurnData()
  728. if data then
  729. self:updateTurns(data)
  730. else
  731. return
  732. end
  733. if not self._turnTimer then
  734. self._turnTimer = cc.Director:getInstance():getScheduler():scheduleScriptFunc(function()
  735. ----------------------
  736. local data = self:getTurnData()
  737. if data then
  738. self:updateTurns(data)
  739. else
  740. self:stopTurn()
  741. self:onResponseGameResult(self._resultData)
  742. end
  743. end,2,false)
  744. end
  745. end
  746. function PdkRoomView:stopTurn(isClean)
  747. isClean = isClean or true
  748. if self._turnTimer then
  749. cc.Director:getInstance():getScheduler():unscheduleScriptEntry(self._turnTimer)
  750. self._turnTimer = nil
  751. if isClean then self._cmdQueue = {} end
  752. end
  753. end
  754. --[[
  755. ,defVar("selfId", VT_Int, 0)--自己ID
  756. ,defVar("userId", VT_Int, 0)
  757. ,defVar("cardType", VT_Short, 0)
  758. ,defVar("leftNum", VT_Short, 0)--出牌者剩余多少张牌
  759. ,defVar("cards", VT_Vector(VT_UChar), {})
  760. passData.userId = tonumber(player.userId)
  761. passData.viewPos = nextTurn
  762. passData.seatId = player.seatId
  763. passData.cards = {}
  764. passData.opType = 0
  765. ]]
  766. -- 处理是否是出牌,如果出牌,则显示对应玩家出牌,如果是pass,显示对应玩家pass
  767. function PdkRoomView:updateTurns( data )
  768. local msg = data
  769. self._leftOps = #self._turnsQueue
  770. self:updateProgress()
  771. self.lastOutFlag = msg.opType--操作类型
  772. local viewPos = data.viewPos
  773. local node = self:getPlayerNode(data.userId)
  774. self:showTurns(viewPos)
  775. if node then
  776. local function show()
  777. if viewPos == 1 then--自己能出牌
  778. if self._lastOutPos == 1 then
  779. self:cleanLastCards()
  780. self.lastOutFlag = -1
  781. end
  782. self:clearPosShow(1)
  783. self:showTurnBtn(true)
  784. else--别人能出牌,对应位置出牌
  785. self:showTurnBtn(false)
  786. end
  787. local outData = {}
  788. outData.selfId = self._room:getMyself().userId
  789. outData.userId = msg.userId
  790. outData.cardType = msg.opType
  791. outData.leftNum = msg.leftNum
  792. outData.cards = clone(msg.cards)
  793. self:onResponseOutCards({response=outData})
  794. end
  795. local function passShow()
  796. if viewPos == 1 then
  797. self:showEffect(viewPos, ETS.PASS)
  798. self:showPass()
  799. self:cleanLastCards(false)
  800. else
  801. self:showEffect(viewPos, ETS.PASS)
  802. end
  803. end
  804. if msg.opType == 0 then
  805. node:runAction(cc.Sequence:create(cc.DelayTime:create(0.1), cc.CallFunc:create(passShow)))
  806. else
  807. show()
  808. end
  809. end
  810. end
  811. -- 显示轮次时钟
  812. function PdkRoomView:showTurns( viewPos )
  813. for _,node in pairs(self._playerNodes) do
  814. local is = node:getInfo().viewPos==viewPos
  815. node:setTurn(is)
  816. if is then self:clearPosShow(viewPos) end
  817. end
  818. end
  819. -- 广播当前桌子轮次@userId@seatId@outFlag
  820. function PdkRoomView:onResponseUpdateTurns( data )
  821. self:addTurn(data)
  822. end
  823. -- 清理上一次的出牌
  824. function PdkRoomView:cleanLastCards(isClean)
  825. if isClean==nil then isClean = true end
  826. if self._lastOutPos > 0 then
  827. if isClean == true then
  828. self:clearPosShow(self._lastOutPos)
  829. end
  830. self._lastCards = {}
  831. self._lastOutType = 0
  832. self._lastOutPos = 0
  833. end
  834. end
  835. -- 玩家出牌成功
  836. function PdkRoomView:onResponseOutCards( data )
  837. local msg = data.response
  838. local isContinue = #self._lastCards>0 and self._lastOutType>0
  839. -- 清理上一次的出牌
  840. self:cleanLastCards()
  841. if msg.isMustBomb and msg.isMustBomb == 1 then
  842. msg.cardType = ETS.NONE
  843. end
  844. local viewPos = self._room:getPlayer(msg.userId).viewPos
  845. -- 缓存上次出的牌
  846. self._lastOutPos = viewPos
  847. self._lastOutType = msg.cardType
  848. self._lastCards = msg.cards
  849. self:showTurns(0)
  850. if #msg.cards <= 0 then
  851. msg.cardType = 0
  852. end
  853. self:showCards(msg.cards, viewPos, msg.cardType, isContinue)
  854. --玩家剩余牌
  855. local node = self:getPlayerNode(msg.userId)
  856. if node then
  857. if not node:isAlarm() and msg.leftNum==1 then
  858. if self:getMode()==0 then
  859. if node:getInfo().viewPos==2 then PdkSoundHelper:single( node:getInfo().sex ) end
  860. elseif self:getMode()==1 then
  861. if node:getInfo().viewPos==3 then PdkSoundHelper:single( node:getInfo().sex ) end
  862. end
  863. end
  864. node:showLeft(msg.leftNum)
  865. end
  866. if viewPos == 1 then--判断是否自己出牌
  867. self:showTurnBtn(false)
  868. for _,v in pairs(msg.cards) do
  869. self:removeCardNode(v)
  870. end
  871. if msg.leftNum==1 then
  872. PdkSoundHelper:single( node:getInfo().sex )
  873. end
  874. --还原不可点
  875. self:downCanotOuts(self:getHandCards(), false)
  876. self:resetCardsPos()
  877. else
  878. self:removeOtherCards(viewPos, msg.cards)
  879. end
  880. -----------
  881. -- local d = self:getTurnData(false)
  882. -- if d then
  883. -- local msg = d
  884. -- if self.lastOutFlag ~= 0 then--连续两次要不起要间隔
  885. -- if msg.opType == 0 then
  886. -- self:stopTurn(false)
  887. -- self:startTurns()
  888. -- return
  889. -- end
  890. -- end
  891. -- end
  892. end
  893. -- 玩家自己显示要不起
  894. function PdkRoomView:showPass()
  895. self.ui.Items.imgTip:setOpacity(0)
  896. self.ui.Items.imgTip:setVisible(true)
  897. local ac = cc.Sequence:create(cc.FadeIn:create(0.2), cc.DelayTime:create(1), cc.FadeOut:create(0.2))
  898. self.ui.Items.imgTip:runAction(ac)
  899. --手牌变暗
  900. local anFunc = function ()
  901. for k,v in pairs(self._selfCards) do
  902. v:setNoTouch(true)
  903. end
  904. end
  905. local mingFunc = function ()
  906. for k,v in pairs(self._selfCards) do
  907. v:setNoTouch(false)
  908. end
  909. end
  910. local ac = cc.Sequence:create(cc.CallFunc:create(anFunc), cc.DelayTime:create(0.1), cc.CallFunc:create(mingFunc))
  911. self.cardRoot:runAction(ac)
  912. end
  913. -- cards@单张或者对子需要
  914. function PdkRoomView:showEffect( viewPos, effectType, dltWidth, cards, isContinue )
  915. if dltWidth == nil then
  916. dltWidth = 50
  917. end
  918. local rate = math.random(100)
  919. local stdRate = 70
  920. isContinue = isContinue or false
  921. local pNode = self:getPlayerNodeVpos(viewPos)
  922. if pNode==nil then return end
  923. local pInfo = pNode:getInfo()
  924. local sex = pInfo.sex
  925. local node = nil
  926. if effectType == ETS.PASS then
  927. local cb = function ()
  928. local node = self:getPlayerNodeVpos(viewPos)
  929. if node then node:setTurn(false) end
  930. end
  931. node = PdkEffectHelper:getPass(cb)
  932. local idx = math.random(4)
  933. PdkSoundHelper:effectPass( sex, idx )
  934. elseif effectType == ETS.SINGLE_CARD then
  935. local _, val = pokerParse(cards[1])
  936. PdkSoundHelper:effectSingle( sex ,val )
  937. elseif effectType == ETS.DUI_ZI then
  938. local _, val = pokerParse(cards[1])
  939. if isContinue and rate >= stdRate and PdkSoundHelper:getLanguageType() == 1 then
  940. PdkSoundHelper:daNi( sex )
  941. else
  942. PdkSoundHelper:effectDouble( sex, val )
  943. end
  944. elseif effectType == ETS.SHUN_ZI then
  945. node = PdkEffectHelper:getShunzi()
  946. if viewPos==1 and node then
  947. node:setScale(1.2)
  948. end
  949. if isContinue and rate>=stdRate and PdkSoundHelper:getLanguageType() == 1 then
  950. PdkSoundHelper:daNi( sex )
  951. else
  952. PdkSoundHelper:effectShunzi( sex )
  953. end
  954. elseif effectType == ETS.LIAN_DUI then
  955. node = PdkEffectHelper:getLiandui()
  956. if isContinue and rate>=stdRate and PdkSoundHelper:getLanguageType() == 1 then
  957. PdkSoundHelper:daNi( sex )
  958. else
  959. PdkSoundHelper:effectLiandui( sex )
  960. end
  961. elseif effectType == ETS.THREE_AND_TWO or effectType == ETS.THREE_AND_DUI or effectType == ETS.THREE then
  962. --根据牌获取是否是三带一或三个
  963. local tp = PokerUtil:checkType(cards)
  964. if tp == ETS.THREE_AND_ONE then
  965. node = PdkEffectHelper:getSandaiyi()
  966. PdkSoundHelper:effect3And1( sex )
  967. elseif tp == ETS.THREE_AND_TWO or tp == ETS.THREE_AND_DUI then
  968. node = PdkEffectHelper:getSandaier()
  969. if isContinue and rate>=stdRate and PdkSoundHelper:getLanguageType() == 1 then
  970. PdkSoundHelper:daNi( sex )
  971. else
  972. PdkSoundHelper:effect3And2( sex,effectType )
  973. end
  974. elseif tp == ETS.THREE then
  975. local _, val = pokerParse(cards[1])
  976. PdkSoundHelper:effectThree( sex, val )
  977. end
  978. elseif effectType == ETS.FOUR_AND_THREE then
  979. node = PdkEffectHelper:getSidaisan()
  980. PdkSoundHelper:effect4And3( sex )
  981. elseif effectType == ETS.BOMB then
  982. node = PdkEffectHelper:getBomb()
  983. PdkSoundHelper:effectBomb( sex )
  984. elseif effectType == ETS.AIRPLANE then
  985. node = PdkEffectHelper:getPlan()
  986. PdkSoundHelper:effectPlane( sex )
  987. elseif effectType == ETS.FOUR_AND_ONE then --四带一
  988. node = PdkEffectHelper:getSidaiyi()
  989. PdkSoundHelper:effect4And1( sex )
  990. --[[ elseif effectType == ETS.SPRING_HUA then
  991. node = PdkEffectHelper:getSpring()--]]
  992. end
  993. if node then
  994. local pt = clone(PdkRoomViewConfig.SHOW_CARD_POS[self:getMode()][viewPos])
  995. if self:getMode() >= 2 then
  996. pt = clone(PdkRoomViewConfig.RECORD_SHOW_CARD_POS4[self:getMode()][viewPos])
  997. end
  998. if effectType~=ETS.PASS then
  999. if effectType==ETS.SHUN_ZI then
  1000. if viewPos == 2 then
  1001. -- if self:getMode()==0 then
  1002. -- pt.x = pt.x
  1003. -- else
  1004. pt.x = pt.x - dltWidth*2
  1005. -- end
  1006. elseif viewPos == 3 then
  1007. pt.x = pt.x
  1008. else
  1009. pt.x = pt.x-50
  1010. pt.y = 320*g_radio_y
  1011. end
  1012. else
  1013. if viewPos == 2 then
  1014. -- if self:getMode()==0 then
  1015. -- pt.x = pt.x + dltWidth
  1016. -- else
  1017. pt.x = pt.x - dltWidth
  1018. -- end
  1019. elseif viewPos == 3 or viewPos == 4 then
  1020. pt.x = pt.x + dltWidth
  1021. end
  1022. end
  1023. pt.y = pt.y - (PdkRoomViewConfig.CARD_HEIGHT/5*1)*PdkRoomViewConfig.CARD_SCALE[2]
  1024. if effectType==ETS.BOMB then
  1025. pt.y = (pt.y+120)*g_radio_y
  1026. end
  1027. if viewPos == 1 then
  1028. pt.x = CENTER_X
  1029. pt.y = 300*g_radio_y
  1030. end
  1031. else
  1032. pt.y = pt.y + 40
  1033. if effectType==ETS.PASS then
  1034. if viewPos == 1 then
  1035. pt.y = 300*g_radio_y--自己pass位置调整
  1036. pt.x = CENTER_X
  1037. else
  1038. if viewPos == 2 then --and self:getMode()==1
  1039. pt.x = pt.x-80
  1040. pt.y = (pt.y + 50)*g_radio_y
  1041. end
  1042. pt.y = (pt.y - 50)*g_radio_y
  1043. end
  1044. end
  1045. end
  1046. node:setPosition(pt)
  1047. self:addChild(node)
  1048. if node.onEnter and type(node.onEnter)=='function' then
  1049. node:onEnter()
  1050. end
  1051. end
  1052. end
  1053. function PdkRoomView:cleanOtherHands()
  1054. for _,hands in ipairs(self._otherCards) do
  1055. for _,node in ipairs(hands) do
  1056. if node and node.getParent and node:getParent() then
  1057. node:removeFromParent()
  1058. end
  1059. end
  1060. end
  1061. self._otherCards = {{}, {}, {}, {}}
  1062. end
  1063. -- 游戏单局结算
  1064. function PdkRoomView:onResponseGameResult( data )
  1065. if self._gameResult==true then
  1066. return
  1067. end
  1068. self.ui.Items.btnPlay.play = false
  1069. self.ui.Items.btnPlay:loadTextureNormal("record_play.png", 1)
  1070. self:stopTurn(false)
  1071. self._playStart = false
  1072. self._gameResult = true
  1073. local msg = data.response
  1074. for _,v in pairs(msg.players) do
  1075. local node = self:getPlayerNode(v.userId)
  1076. if node then
  1077. node:setScore(v.totalScore)
  1078. node:setTurn(false)
  1079. end
  1080. node:hideLeft()
  1081. end
  1082. end
  1083. -- 总结算
  1084. function PdkRoomView:onResponseGameOver( data )
  1085. local msg = data.response
  1086. for _,player in ipairs(msg.players) do
  1087. local pdata = self._room:getPlayer(player.userId)
  1088. player.unionid = pdata.unionid
  1089. player.headimgurl = pdata.headimgurl
  1090. player.gpsInfo = pdata.gpsInfo
  1091. player.sex = pdata.sex
  1092. player.openid = pdata.openid
  1093. player.nickname = pdata.nickname
  1094. player.areano = pdata.areano
  1095. end
  1096. -- 缓存结算信息
  1097. self._isGameOver = true
  1098. self._gameOverData = msg
  1099. local roomInfo = self.roomInfo
  1100. self._gameOverData.nShowTableId = roomInfo.nTableId
  1101. self._gameOverData.startCount = roomInfo.nGameStartCount
  1102. self._gameOverData.totalCount = roomInfo.nTotalGameNum
  1103. self._gameOverData.roomRule = self:getRuleString()
  1104. if self._gameResult==false then--已经展示过小结算后解散房间
  1105. self:onNormalShowGameOver()
  1106. end
  1107. end
  1108. --[[先显示小局结算,再显示总结算--]]
  1109. function PdkRoomView:onNormalShowGameOver( data )
  1110. self._gameResult = false
  1111. local showFunc = function (msg)
  1112. local view = import("pk_luzhoupdk.luaScript.Views.Room.Sub.luzhouPdkGameOverView"):new(msg)
  1113. view:setAnchorPoint(cc.p(0.5, 0.5))
  1114. app:showWaitDialog(view)
  1115. end
  1116. if self._isGameOver and self._gameOverData then
  1117. showFunc(self._gameOverData)
  1118. end
  1119. end
  1120. ----------------------------------------------------------------------------------------------------------------------
  1121. ----------------------------------------------------------------------------------------------------------------------
  1122. -- 单局结算显示剩余牌
  1123. function PdkRoomView:showLeftCards( pos, cards )
  1124. self:showTurnBtn(false)
  1125. if #cards <=0 then return end
  1126. self:clearPosShow(pos)
  1127. if pos==2 then --self:getMode()==1 and
  1128. local tmp = {}
  1129. for _,v in ipairs(cards) do
  1130. table.insert(tmp, 1, v)
  1131. end
  1132. cards = tmp
  1133. end
  1134. local scaleWdt = PdkRoomViewConfig.CARD_DLT_WIDTH*PdkRoomViewConfig.CARD_SCALE[2]
  1135. local root = cc.Node:create()
  1136. local nodes = {}
  1137. for i,card in ipairs(cards) do
  1138. local node = self:genCard(card)
  1139. local pt = cc.p(0, 0)
  1140. if pos==1 then --self:getMode() == 0 or
  1141. pt.x = pt.x + (i-1)*scaleWdt
  1142. node:setLocalZOrder(100+i)
  1143. else
  1144. if i>=9 then
  1145. pt.y = pt.y - 80
  1146. if pos ~= 2 then
  1147. pt.x = pt.x + (i-math.floor(i/9)*9)*scaleWdt
  1148. else
  1149. pt.x = pt.x - (i-math.floor(i/9)*9)*scaleWdt
  1150. node:setLocalZOrder(36-i)
  1151. end
  1152. else
  1153. if pos ~= 2 then
  1154. pt.x = pt.x + (i-math.floor(i/9)*9-1)*scaleWdt
  1155. else
  1156. pt.x = pt.x - (i-math.floor(i/9)*9-1)*scaleWdt
  1157. node:setLocalZOrder(16-i)
  1158. end
  1159. end
  1160. end
  1161. node:setScale(PdkRoomViewConfig.CARD_SCALE[2])
  1162. node:setPosition(pt)
  1163. root:addChild(node)
  1164. node:setVisible(false)
  1165. table.insert(nodes, node)
  1166. end
  1167. local dltWidth = 0
  1168. local rpt = clone(PdkRoomViewConfig.SHOW_CARD_POS[self:getMode()][pos])
  1169. if pos == 1 then
  1170. rpt.x = 200
  1171. rpt.y = 110
  1172. else
  1173. dltWidth = #cards/2*scaleWdt
  1174. end
  1175. root:setPosition(rpt)
  1176. self.cardRoot:addChild(root)
  1177. table.insert(self._showCards[pos], root)
  1178. for i,v in ipairs(nodes) do
  1179. v:runAction(cc.Sequence:create(cc.DelayTime:create((i-1)*0.05), cc.CallFunc:create(function ()
  1180. v:setVisible(true)
  1181. end)))
  1182. end
  1183. end
  1184. -- 根据位置显示一组牌 cards@出牌牌组 pos@出牌视角位置 tp@出牌的类型isContinue@是否接牌
  1185. function PdkRoomView:showCards( cards, pos, tp, isContinue )
  1186. self:clearPosShow(pos)
  1187. self._lastCards =cards
  1188. self._lastOutType = tp
  1189. if pos==2 then -- self:getMode()==1 and
  1190. local tmp = {}
  1191. for _,v in ipairs(cards) do
  1192. table.insert(tmp, 1, v)
  1193. end
  1194. cards = tmp
  1195. end
  1196. local root = cc.Node:create()
  1197. local scale = PdkRoomViewConfig.CARD_SCALE[2]
  1198. local allCount = #cards
  1199. for i,card in ipairs(cards) do
  1200. local node = self:genCard(card)
  1201. local pt = cc.p(0, 0)
  1202. if pos == 1 then
  1203. local midIdx = allCount/2
  1204. if i<midIdx then--左边
  1205. pt.x = 0 - (midIdx-i-1)*PdkRoomViewConfig.CARD_DLT_WIDTH*scale
  1206. else--右边
  1207. pt.x = 0 + (i-midIdx+1)*PdkRoomViewConfig.CARD_DLT_WIDTH*scale
  1208. end
  1209. pt.x = pt.x - PdkRoomViewConfig.CARD_WIDTH/2*scale
  1210. else
  1211. if pos ==2 then -- self:getMode()==1 and
  1212. node:setLocalZOrder(16-i)
  1213. pt.x = pt.x - (i-1)*PdkRoomViewConfig.CARD_DLT_WIDTH*scale
  1214. else
  1215. pt.x = pt.x + (i-1)*PdkRoomViewConfig.CARD_DLT_WIDTH*scale
  1216. end
  1217. end
  1218. node:setScale(scale)
  1219. node:setPosition(pt)
  1220. root:addChild(node)
  1221. end
  1222. local dltWidth = 0
  1223. local rpt = clone(PdkRoomViewConfig.SHOW_CARD_POS[self:getMode()][pos])
  1224. if self:getMode() >= 2 then
  1225. rpt = clone(PdkRoomViewConfig.RECORD_SHOW_CARD_POS4[self:getMode()][pos])
  1226. end
  1227. if pos == 1 then
  1228. rpt = cc.p(CENTER_X, 320*g_radio_y)
  1229. else
  1230. dltWidth = math.floor(#cards/2)*PdkRoomViewConfig.CARD_DLT_WIDTH*scale
  1231. end
  1232. root:setPosition(rpt)
  1233. self.cardRoot:addChild(root)
  1234. table.insert(self._showCards[pos], root)
  1235. --牌型动画
  1236. self:showEffect(pos, tp, dltWidth, cards, isContinue)
  1237. end
  1238. -- 清除某玩家的出牌
  1239. function PdkRoomView:clearPosShow(pos)
  1240. local nodes = self._showCards[pos]
  1241. for _,v in ipairs(nodes) do
  1242. if v:getParent() then v:removeFromParent() end
  1243. end
  1244. self._showCards[pos] = {}
  1245. end
  1246. -- 添加玩家节点
  1247. function PdkRoomView:addPlayerNode( pInfo )
  1248. local node = self._playerNodes[tonumber(pInfo.userId)]
  1249. if node then return end
  1250. node = PdkPlayerNode:new()
  1251. local rule = self._room:getRoomInfo().specialRule
  1252. local allowPass = self._room:getRoomInfo().allowPass
  1253. node:setGameInfo(json.encode({allowPass=allowPass}))
  1254. node:setMaxPlayerCount(self._room:getRoomInfo().nMaxPlayCount)
  1255. node:setShowNum(getNumBand(rule, 0x0020)>0)--是否显示牌张数
  1256. node:setInfo(pInfo)
  1257. node:setReady(pInfo.playFlag==1)
  1258. node:setHost(pInfo.userId==self.roomInfo.nRoomOwnedUid)
  1259. node:setPosition(PdkRoomViewConfig.PLAYER_POS[self:getMode()][pInfo.viewPos])
  1260. self._playerNodes[pInfo.userId] = node
  1261. node:setLocalZOrder(10)
  1262. self.ui.Items.toolPanel:getParent():addChild(node)
  1263. end
  1264. -- 删除玩家节点
  1265. function PdkRoomView:delPlayerNode( uid )
  1266. if self._gameResult or self._isGameOver then return end
  1267. local node = self._playerNodes[uid]
  1268. if not node then return end
  1269. node:removeFromParent()
  1270. self._playerNodes[uid] = nil
  1271. end
  1272. -- 获取玩家节点
  1273. function PdkRoomView:getPlayerNode( uid )
  1274. return self._playerNodes[tonumber(uid)]
  1275. end
  1276. -- 根据视图获取玩家节点
  1277. function PdkRoomView:getPlayerNodeVpos( viewPos )
  1278. for _,v in pairs(self._playerNodes) do
  1279. if v:getInfo().viewPos==viewPos then
  1280. return v
  1281. end
  1282. end
  1283. return nil
  1284. end
  1285. -- 发牌
  1286. function PdkRoomView:sendCards( cards_, pos )
  1287. local cards = pokerSortPdkCards(cards_)
  1288. local CardsCount = #cards
  1289. for i,card in ipairs(cards) do
  1290. local ac = cc.Sequence:create(cc.DelayTime:create(i*0.05), cc.CallFunc:create(function ()
  1291. self:sendOneCard(card.cid, i, pos, i==CardsCount, CardsCount)
  1292. if self:getMode()==0 then
  1293. -- if i==CardsCount then self:showOtherCards(true) end
  1294. end
  1295. end))
  1296. self.cardRoot:runAction(ac)
  1297. end
  1298. end
  1299. -- 发一张牌
  1300. function PdkRoomView:sendOneCard( card, i, pos, islast, allCount )
  1301. -- local node = self:genCard(card)
  1302. local node = self:genCard(-1)--back
  1303. node.cid = card
  1304. node:setScale(PdkRoomViewConfig.CARD_SCALE[pos])--PdkRoomViewConfig.CARD_SCALE_START
  1305. node:setLast(islast)
  1306. local endX = CENTER_X + (allCount-allCount/2+1)*PdkRoomViewConfig.CARD_DLT_WIDTH*PdkRoomViewConfig.CARD_SCALE[1]
  1307. local pt = cc.p(0, 0)
  1308. local mode = self:getMode()
  1309. local otherScale = 0.4
  1310. if pos ~= 1 then
  1311. node:setScale(otherScale)
  1312. pt = clone(PdkRoomViewConfig.CARD_POS[mode][pos])
  1313. -- if mode==0 then--两人
  1314. -- pt.x = pt.x + i*PdkRoomViewConfig.CARD_DLT_WIDTH*otherScale
  1315. -- node:setLocalZOrder(i)
  1316. -- else--三人
  1317. if pos == 2 then
  1318. pt.x = pt.x - i*PdkRoomViewConfig.CARD_DLT_WIDTH*otherScale
  1319. node:setLocalZOrder(16-i)
  1320. else
  1321. pt.x = pt.x + i*PdkRoomViewConfig.CARD_DLT_WIDTH*otherScale
  1322. node:setLocalZOrder(i)
  1323. end
  1324. -- end
  1325. else
  1326. pt.x = CENTER_X
  1327. local midIdx = allCount/2
  1328. if i<=midIdx then--左边
  1329. pt.x = pt.x - (midIdx-i-1)*PdkRoomViewConfig.CARD_DLT_WIDTH*PdkRoomViewConfig.CARD_SCALE[1]
  1330. else--右边
  1331. pt.x = pt.x + (i-midIdx+1)*PdkRoomViewConfig.CARD_DLT_WIDTH*PdkRoomViewConfig.CARD_SCALE[1]
  1332. end
  1333. pt.x = pt.x - PdkRoomViewConfig.CARD_WIDTH/2*PdkRoomViewConfig.CARD_SCALE[1]
  1334. pt.y = PdkRoomViewConfig.CARD_POS[mode][pos].y
  1335. node:setLocalZOrder(i)
  1336. end
  1337. node:setPosition(cc.p(endX, pt.y))
  1338. node:setOpacity(0)
  1339. self.cardRoot:addChild(node)
  1340. local ac = nil
  1341. if pos ~=1 then
  1342. ac = cc.Sequence:create(cc.Spawn:create(cc.MoveTo:create(0.1, pt), cc.FadeIn:create(0.1)), cc.CallFunc:create(function ()
  1343. table.insert(self._otherCards[pos], node)
  1344. PdkSoundHelper:playSend()
  1345. end), cc.DelayTime:create((allCount-i)*0.08), cc.CallFunc:create(function() node:setCard(node.cid) end ))
  1346. node:runAction(ac)
  1347. else
  1348. ac = cc.Sequence:create(cc.Spawn:create(cc.MoveTo:create(0.1, pt), cc.FadeIn:create(0.1)), cc.CallFunc:create(function ()
  1349. table.insert(self._selfCards, node)
  1350. PdkSoundHelper:playSend()
  1351. end), cc.DelayTime:create((allCount-i)*0.08), cc.CallFunc:create(function() node:setCard(node.cid) end ))
  1352. node:runAction(ac)
  1353. end
  1354. end
  1355. -- 发一张牌没有动画
  1356. function PdkRoomView:sendOneCardNoAct( card, i, pos, islast, allCount )
  1357. local node = self:genCard(card)
  1358. node:setScale(PdkRoomViewConfig.CARD_SCALE[pos])
  1359. node:setLast(islast)
  1360. local pt = cc.p(0, 0)
  1361. if pos ~= 1 then
  1362. pt = clone(PdkRoomViewConfig.CARD_POS[self:getMode()][pos])
  1363. else
  1364. local midIdx = math.floor(allCount/2)
  1365. if i<midIdx then--左边
  1366. pt.x = CENTER_X - (midIdx-i-1)*PdkRoomViewConfig.CARD_DLT_WIDTH*PdkRoomViewConfig.CARD_SCALE[pos]
  1367. else--右边
  1368. pt.x = CENTER_X + (i-midIdx+1)*PdkRoomViewConfig.CARD_DLT_WIDTH*PdkRoomViewConfig.CARD_SCALE[pos]
  1369. end
  1370. pt.x = pt.x - PdkRoomViewConfig.CARD_WIDTH/2*PdkRoomViewConfig.CARD_SCALE[pos]
  1371. pt.y = PdkRoomViewConfig.CARD_POS[1][pos].y
  1372. end
  1373. node:setPosition(pt)
  1374. node:setLocalZOrder(i)
  1375. self.cardRoot:addChild(node)
  1376. table.insert(self._selfCards, node)
  1377. end
  1378. -- 创建一张牌
  1379. function PdkRoomView:genCard( card )
  1380. local node = PdkCardNode:new()
  1381. node:setCard(card)
  1382. node:setSelectedHeight(PdkRoomViewConfig.SELECTED_HEIGHT)
  1383. node:setNormalHeight(PdkRoomViewConfig.NORMAL_HEIGHT)
  1384. return node
  1385. end
  1386. -- 从手牌中获取一张牌
  1387. function PdkRoomView:getCardNode( card )
  1388. if card > 0x00 and card <= 0x3d then
  1389. for _,v in pairs(self._selfCards) do
  1390. if v:getVal()==card then return v end
  1391. end
  1392. return nil
  1393. else
  1394. return nil
  1395. end
  1396. end
  1397. -- 根据牌ID移除一张手牌,并重新调整手牌位置
  1398. function PdkRoomView:removeCardNode( card )
  1399. local node = self:getCardNode(card)
  1400. if not node then return end
  1401. for i=#self._selfCards,1,-1 do
  1402. if self._selfCards[i]:getVal()==card then
  1403. table.remove(self._selfCards, i)
  1404. break
  1405. end
  1406. end
  1407. node:removeFromParent()
  1408. --reset pos
  1409. self:resetCardsPos()
  1410. end
  1411. -- 移除牌
  1412. function PdkRoomView:removeOtherCards( viewPos, cards )
  1413. local nodeSet = self._otherCards[viewPos]
  1414. for _,card in ipairs(cards) do
  1415. if card > 0x00 and card <= 0x3d then
  1416. for _,v in pairs(nodeSet) do
  1417. if v:getVal()==card then
  1418. for i=#nodeSet,1,-1 do
  1419. if nodeSet[i]:getVal()==card then
  1420. table.remove(nodeSet, i)
  1421. break
  1422. end
  1423. end
  1424. v:removeFromParent()
  1425. end
  1426. end
  1427. end
  1428. end
  1429. local pos = viewPos
  1430. local mode = self:getMode()
  1431. local otherScale = 0.4
  1432. for i,v in ipairs(nodeSet) do
  1433. local pt = cc.p(0, 0)
  1434. if pos ~= 1 then
  1435. pt = clone(PdkRoomViewConfig.CARD_POS[mode][pos])
  1436. -- if mode==0 then--两人
  1437. -- pt.x = pt.x + i*PdkRoomViewConfig.CARD_DLT_WIDTH*otherScale
  1438. -- v:setLocalZOrder(i)
  1439. -- else--三人
  1440. if pos == 2 then
  1441. pt.x = pt.x - i*PdkRoomViewConfig.CARD_DLT_WIDTH*otherScale
  1442. v:setLocalZOrder(16-i)
  1443. else
  1444. pt.x = pt.x + i*PdkRoomViewConfig.CARD_DLT_WIDTH*otherScale
  1445. v:setLocalZOrder(i)
  1446. end
  1447. -- end
  1448. v:setPosition(pt)
  1449. end
  1450. end
  1451. end
  1452. -- 获取当前手牌
  1453. function PdkRoomView:getHandCards()
  1454. local handCards = {}
  1455. for _,v in pairs(self._selfCards) do
  1456. table.insert(handCards, v:getVal())
  1457. end
  1458. return handCards
  1459. end
  1460. -- 重置手牌位置
  1461. function PdkRoomView:resetCardsPos( )
  1462. if #self._selfCards<=0 then return end
  1463. local mode = self:getMode()
  1464. local pos = 1
  1465. local scale = PdkRoomViewConfig.CARD_SCALE[pos]
  1466. local dtpx = (16 - #self._selfCards)/2*PdkRoomViewConfig.CARD_DLT_WIDTH*scale
  1467. local allCount = #self._selfCards
  1468. local midIdx = allCount/2
  1469. for i,v in ipairs(self._selfCards) do
  1470. local pt = cc.p(CENTER_X, 0)
  1471. if i<midIdx then--左边
  1472. pt.x = pt.x - (midIdx-i-1)*PdkRoomViewConfig.CARD_DLT_WIDTH*scale
  1473. else--右边
  1474. pt.x = pt.x + (i-midIdx+1)*PdkRoomViewConfig.CARD_DLT_WIDTH*scale
  1475. end
  1476. pt.x = pt.x - PdkRoomViewConfig.CARD_WIDTH/2*scale
  1477. pt.y = PdkRoomViewConfig.CARD_POS[self:getMode()][pos].y
  1478. v:setPosition(pt)
  1479. v:setLast(i==allCount)
  1480. v:setNormal()
  1481. end
  1482. end
  1483. -- 提示对应的牌
  1484. function PdkRoomView:tipCards( cards )
  1485. self:resetCardsPos()
  1486. for _,v in pairs(cards) do
  1487. local node = self:getCardNode(v.cid)
  1488. if node and node:getVal()>0 then
  1489. self._selectCards[node:getVal()] = node
  1490. node:setDown()
  1491. end
  1492. end
  1493. end
  1494. -- 清除所有牌
  1495. function PdkRoomView:cleanSelfCards()
  1496. for _,v in pairs(self._selfCards) do
  1497. if v:getParent() then v:removeFromParent() end
  1498. end
  1499. self._selfCards = {}
  1500. end
  1501. function PdkRoomView:cleanShowCards()
  1502. for _,v in pairs(self._showCards) do
  1503. for _,vv in pairs(v) do
  1504. if vv and vv:getParent() then
  1505. vv:removeFromParent()
  1506. end
  1507. end
  1508. end
  1509. self._showCards = {{},{},{},{}}
  1510. end
  1511. -- 二人玩显示另外一组牌
  1512. function PdkRoomView:showOtherCards(is)
  1513. if is then
  1514. self.imgOtherCards:setVisible(true)
  1515. local num = 13
  1516. --if self.ruleType==2 then num = 15 end
  1517. self.txtOtherCards:setString(string.format("剩余%d张", num))
  1518. else
  1519. self.imgOtherCards:setVisible(false)
  1520. end
  1521. end
  1522. function PdkRoomView:onEnter()
  1523. PdkRoomView.super.onEnter()
  1524. PokerUtil = require("pk_luzhoupdk.luaScript.Views.Room.luzhouPokerUtil"):new({isChai=self.ruleIsChaiBomb, isFAT=self.ruleIsFAT})
  1525. self:bindEvents()
  1526. local changeDesk = tonumber(loadUserInfo("lzpdk_setting_bg_idx")) or 2
  1527. self:onNormalChangeDesktop({idx=changeDesk-1})
  1528. PdkSoundHelper:playBgMusic()
  1529. local roomInfo = self._room:getRoomInfo()
  1530. self.ui.Items.systemTime:setText(string.format("%s 局数:%d/%d", os.date("%m-%d %H:%M:%S", roomInfo.endtime), roomInfo.nGameStartCount or 0, roomInfo.nTotalGameNum or 0 ))
  1531. -- 默认开始回放
  1532. self:onClickButtonPlay( self.ui.Items.btnPlay, 1 )
  1533. end
  1534. function PdkRoomView:onExit()
  1535. if self.Time then
  1536. cc.Director:getInstance():getScheduler():unscheduleScriptEntry(self.Time)
  1537. self.Time = nil
  1538. end
  1539. if self._gameResultTimer then
  1540. cc.Director:getInstance():getScheduler():unscheduleScriptEntry(self._gameResultTimer)
  1541. self._gameResultTimer = nil
  1542. end
  1543. for _,node in pairs(self._playerNodes) do
  1544. if node then node:setTurn(false) end
  1545. end
  1546. self:stopTurn()
  1547. PokerUtil = nil
  1548. stopBGMusic()
  1549. end
  1550. return PdkRoomView