Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

1662 рядки
48 KiB

  1. -- xx : 2018/5/7
  2. -- 跑得快回放界面
  3. local PdkDef = require("luaScript.SubGameDefine.Poker.hejiangPdkWanFa")
  4. local PdkPlayerNode = require("pk_hejiangpdk.luaScript.Views.Room.Node.hejiangPdkPlayerNode")
  5. local PdkCardNode = require("pk_hejiangpdk.luaScript.Views.Room.Node.hejiangPdkCardNode")
  6. local PdkRoomViewConfig = require("pk_hejiangpdk.luaScript.Views.Room.hejiangPdkRoomViewConfig")
  7. local PdkEffectHelper = require("pk_hejiangpdk.luaScript.Views.Room.hejiangPdkEffectHelper"):new()
  8. local ETS = PdkRoomViewConfig.EffectType
  9. local PdkSoundHelper = require("pk_hejiangpdk.luaScript.Views.Room.hejiangPdkSoundHelper"):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. self.playing = false
  523. sender:loadTextureNormal("record_play.png", 1)
  524. self:stopTurn(false)
  525. else
  526. sender.play = true
  527. self.playing = true
  528. sender:loadTextureNormal("record_pause.png", 1)
  529. if self._gameResult == true then
  530. self:resetRoundData()
  531. self._turnsQueue = clone(self._backupData)
  532. end
  533. if self._playStart==true then
  534. self:stopTurn(false)
  535. self:startTurns()
  536. else
  537. local myself = self._room:getMyself()
  538. if myself then
  539. local data = {}
  540. data.response = {}
  541. data.response.cards = myself.handCards
  542. local playerCards = {}
  543. local players = self._room:getPlayers()
  544. for _,v in pairs(players) do
  545. playerCards[v.viewPos] = clone(v.handCards)
  546. end
  547. data.response.playerCards = playerCards
  548. local banker = self._room:getPlayer(self._room:getRoomInfo().banker)
  549. data.response.bankerSeat = banker.seatId
  550. self:onResponseSendCards(data)
  551. self.ui:runDelay(2.5, function() self:startTurns() end )
  552. end
  553. end
  554. end
  555. end
  556. function PdkRoomView:onClickButtonToward( sender )
  557. playBtnEffect()
  558. if self.ui.Items.btnPlay.play == nil then
  559. return
  560. end
  561. self.ui.Items.btnPlay.play = true
  562. self:onClickButtonPlay( self.ui.Items.btnPlay )
  563. local data = self:getTurnData()
  564. if data then
  565. self:updateTurns(data)
  566. else
  567. self:onResponseGameResult(self._resultData)
  568. end
  569. self._leftOps = #self._turnsQueue
  570. -- show
  571. self:updateProgress()
  572. self:stopTurn(false)
  573. end
  574. -- 玩家点击房间详情
  575. function PdkRoomView:onClickButtonDetails( sender )
  576. playBtnEffect()
  577. local node = self.ui.Items.btnDetail:getChildByTag(101)
  578. if node then
  579. else
  580. local rule = self:getRuleString()
  581. local view = import("pk_hejiangpdk.luaScript.Views.Room.Sub.hejiangPdkGameDetailView"):new(rule)
  582. view:setPosition(cc.p(view:getSizeWidth()+60, 60))
  583. view:setTag(101)
  584. self.ui.Items.btnDetail:addChild(view)
  585. end
  586. end
  587. function PdkRoomView:onClickButtonReturn( sender )
  588. playBtnEffect()
  589. self:removeFromParent()
  590. end
  591. --[[获取房间详情字符串--]]
  592. function PdkRoomView:getRuleString()
  593. local rule = self.roomInfo.specialRule
  594. local ruleStr = ""
  595. ruleStr = ruleStr..PdkRoomViewConfig.RoonInfoConfig.play[tonumber(self.roomInfo.gamerule)]..","
  596. ruleStr = ruleStr..PdkRoomViewConfig.RoonInfoConfig.num[tonumber(self.roomInfo.playnum)]..","
  597. if getNumBand(rule, 0x0001)>0 then
  598. ruleStr = ruleStr..PdkRoomViewConfig.CreateParamsMean[0x0001]..","
  599. end
  600. if getNumBand(rule, 0x0002)>0 then
  601. ruleStr = ruleStr..PdkRoomViewConfig.CreateParamsMean[0x0002]..","
  602. end
  603. -- if getNumBand(rule, 0x0008)>0 then
  604. -- -- ruleStr = ruleStr..PdkRoomViewConfig.CreateParamsMean[0x0008]..","
  605. -- end
  606. if string.len(ruleStr) > 0 then
  607. ruleStr = string.sub(ruleStr, 1, string.len(ruleStr)-1)
  608. end
  609. return ruleStr
  610. end
  611. -- 设置房间信息
  612. function PdkRoomView:setRoomInfo( info )
  613. self.ui.Items.roomNum:setString(string.format("房号:%06d", info.nTableId))
  614. end
  615. -- 显示轮次
  616. function PdkRoomView:showTurnBtn( is )
  617. if is then --回放出牌
  618. end
  619. end
  620. -- 一键截屏
  621. function PdkRoomView:onClickButtonShot( sender )
  622. playBtnEffect()
  623. showScreenShot()
  624. end
  625. -- 设置点击
  626. function PdkRoomView:onClickButtonSetting( sender )
  627. playBtnEffect()
  628. self:showMenu(false)
  629. local view = import("pk_hejiangpdk.luaScript.Views.Room.Sub.hejiangPdkSettingView"):new()
  630. view:setAnchorPoint(cc.p(0.5, 0.5))
  631. app:showWaitDialog(view)
  632. end
  633. -- 上传日志点击
  634. function PdkRoomView:onClickButtonUlog( sender )
  635. playBtnEffect()
  636. self:showMenu(false)
  637. local view = import("luaScript.Views.Room.UplogView"):new()
  638. view:setAnchorPoint(cc.p(0.5, 0.5))
  639. app:showWaitDialog(view)
  640. end
  641. -- 变暗不能出的牌
  642. function PdkRoomView:downCanotOuts(canotOuts, isTouch)
  643. for _,v in pairs(canotOuts) do
  644. local node = self:getCardNode(v)
  645. if node then node:setNoTouch(isTouch) end
  646. end
  647. end
  648. function PdkRoomView:bindEvents()
  649. -- 游戏设置里更换桌面
  650. -- self:bindEvent(app.room , "pdkNormalEvent_changeDesktop" , handler(self , self.onNormalChangeDesktop))
  651. end
  652. -- 更换桌面
  653. function PdkRoomView:onNormalChangeDesktop( data )
  654. --if data.idx >5 and data.idx<1 then return end
  655. local changeDesk = tonumber(loadUserInfo("hjpdk_setting_bg_idx")) or 2
  656. self.ui.Items.ImageView_bg:loadTexture(string.format("pk_luzhoupdk/res/ui/zy_game/lzpdk_gamebg_%d.jpg", changeDesk), 0)
  657. end
  658. -- 通知玩家分数
  659. function PdkRoomView:onResponseUpdateScore( data )
  660. local msg = data.response
  661. for _,pdata in ipairs(msg.players) do
  662. local node = self:getPlayerNode(pdata.userId)
  663. if node then node:setScore(pdata.totalScore) end
  664. end
  665. end
  666. -- 给玩家发牌
  667. function PdkRoomView:onResponseSendCards( data )
  668. self._leftOps = self._allOps
  669. self:updateProgress()
  670. self:cleanOtherHands()
  671. self._gameResult = false
  672. self._passGameResult = nil
  673. self._playStart = true
  674. self.ui.Items.ButtonToward:setEnabled(false)
  675. for viewPos,v in pairs(data.response.playerCards) do
  676. self:sendCards(v, viewPos)
  677. end
  678. local bankerData = self._room:getPlayerCid(data.response.bankerSeat)
  679. for _,v in pairs( self._playerNodes ) do
  680. v:setBanker(v:getInfo().userId==bankerData.userId)
  681. v:setTurn(false)
  682. v:setScore(0)
  683. end
  684. if self._room:isMyself(bankerData.userId) then
  685. self:runAction(cc.Sequence:create(cc.DelayTime:create(1), cc.CallFunc:create(function ()
  686. self:showTurnBtn(true)
  687. local node = self:getPlayerNodeVpos(1)
  688. if node then node:setTurn(true) end
  689. end)))
  690. else
  691. self:showTurnBtn(false)
  692. self:runAction(cc.Sequence:create(cc.DelayTime:create(1), cc.CallFunc:create(function ()
  693. local node = self:getPlayerNode(bankerData.userId)
  694. if node then node:setTurn(true) end
  695. end)))
  696. end
  697. -- 发完牌后显示牌张数
  698. self.ui:runDelay(2, function ()
  699. local left = 13
  700. --if self.ruleType==2 then left = 15 end
  701. for uid,v in pairs(self._playerNodes) do
  702. v:showLeft(left)
  703. self.ui.Items.ButtonToward:setEnabled(true)
  704. end
  705. end)
  706. end
  707. -- 将回放数据按照先后顺序处理成串行以便调度器调用
  708. function PdkRoomView:addTurnData( data )
  709. table.insert(self._turnsQueue, data)
  710. end
  711. function PdkRoomView:getTurnData( isRemove )
  712. local data = nil
  713. if #self._turnsQueue > 0 then
  714. data = clone(self._turnsQueue[1])
  715. if isRemove==nil then
  716. table.remove(self._turnsQueue, 1)
  717. end
  718. end
  719. return data
  720. end
  721. function PdkRoomView:getTurnLast()
  722. local data = nil
  723. if #self._turnsQueue > 0 then
  724. data = clone(self._turnsQueue[#self._turnsQueue])
  725. end
  726. return data
  727. end
  728. function PdkRoomView:startTurns()
  729. if (self.playing == false) then
  730. return
  731. end
  732. local data = self:getTurnData()
  733. if data then
  734. self:updateTurns(data)
  735. else
  736. return
  737. end
  738. if not self._turnTimer then
  739. self._turnTimer = cc.Director:getInstance():getScheduler():scheduleScriptFunc(function()
  740. ----------------------
  741. local data = self:getTurnData()
  742. if data then
  743. self:updateTurns(data)
  744. else
  745. self:stopTurn()
  746. self:onResponseGameResult(self._resultData)
  747. end
  748. end,2,false)
  749. end
  750. end
  751. function PdkRoomView:stopTurn(isClean)
  752. isClean = isClean or true
  753. if self._turnTimer then
  754. cc.Director:getInstance():getScheduler():unscheduleScriptEntry(self._turnTimer)
  755. self._turnTimer = nil
  756. if isClean then self._cmdQueue = {} end
  757. end
  758. end
  759. --[[
  760. ,defVar("selfId", VT_Int, 0)--自己ID
  761. ,defVar("userId", VT_Int, 0)
  762. ,defVar("cardType", VT_Short, 0)
  763. ,defVar("leftNum", VT_Short, 0)--出牌者剩余多少张牌
  764. ,defVar("cards", VT_Vector(VT_UChar), {})
  765. passData.userId = tonumber(player.userId)
  766. passData.viewPos = nextTurn
  767. passData.seatId = player.seatId
  768. passData.cards = {}
  769. passData.opType = 0
  770. ]]
  771. -- 处理是否是出牌,如果出牌,则显示对应玩家出牌,如果是pass,显示对应玩家pass
  772. function PdkRoomView:updateTurns( data )
  773. local msg = data
  774. self._leftOps = #self._turnsQueue
  775. self:updateProgress()
  776. self.lastOutFlag = msg.opType--操作类型
  777. local viewPos = data.viewPos
  778. local node = self:getPlayerNode(data.userId)
  779. self:showTurns(viewPos)
  780. if node then
  781. local function show()
  782. if viewPos == 1 then--自己能出牌
  783. if self._lastOutPos == 1 then
  784. self:cleanLastCards()
  785. self.lastOutFlag = -1
  786. end
  787. self:clearPosShow(1)
  788. self:showTurnBtn(true)
  789. else--别人能出牌,对应位置出牌
  790. self:showTurnBtn(false)
  791. end
  792. local outData = {}
  793. outData.selfId = self._room:getMyself().userId
  794. outData.userId = msg.userId
  795. outData.cardType = msg.opType
  796. outData.leftNum = msg.leftNum
  797. outData.cards = clone(msg.cards)
  798. self:onResponseOutCards({response=outData})
  799. end
  800. local function passShow()
  801. if viewPos == 1 then
  802. self:showEffect(viewPos, ETS.PASS)
  803. self:showPass()
  804. self:cleanLastCards(false)
  805. else
  806. self:showEffect(viewPos, ETS.PASS)
  807. end
  808. end
  809. if msg.opType == 0 then
  810. node:runAction(cc.Sequence:create(cc.DelayTime:create(0.1), cc.CallFunc:create(passShow)))
  811. else
  812. show()
  813. end
  814. end
  815. end
  816. -- 显示轮次时钟
  817. function PdkRoomView:showTurns( viewPos )
  818. for _,node in pairs(self._playerNodes) do
  819. local is = node:getInfo().viewPos==viewPos
  820. node:setTurn(is)
  821. if is then self:clearPosShow(viewPos) end
  822. end
  823. end
  824. -- 广播当前桌子轮次@userId@seatId@outFlag
  825. function PdkRoomView:onResponseUpdateTurns( data )
  826. self:addTurn(data)
  827. end
  828. -- 清理上一次的出牌
  829. function PdkRoomView:cleanLastCards(isClean)
  830. if isClean==nil then isClean = true end
  831. if self._lastOutPos > 0 then
  832. if isClean == true then
  833. self:clearPosShow(self._lastOutPos)
  834. end
  835. self._lastCards = {}
  836. self._lastOutType = 0
  837. self._lastOutPos = 0
  838. end
  839. end
  840. -- 玩家出牌成功
  841. function PdkRoomView:onResponseOutCards( data )
  842. local msg = data.response
  843. local isContinue = #self._lastCards>0 and self._lastOutType>0
  844. -- 清理上一次的出牌
  845. self:cleanLastCards()
  846. if msg.isMustBomb and msg.isMustBomb == 1 then
  847. msg.cardType = ETS.NONE
  848. end
  849. local viewPos = self._room:getPlayer(msg.userId).viewPos
  850. -- 缓存上次出的牌
  851. self._lastOutPos = viewPos
  852. self._lastOutType = msg.cardType
  853. self._lastCards = msg.cards
  854. self:showTurns(0)
  855. if #msg.cards <= 0 then
  856. msg.cardType = 0
  857. end
  858. self:showCards(msg.cards, viewPos, msg.cardType, isContinue)
  859. --玩家剩余牌
  860. local node = self:getPlayerNode(msg.userId)
  861. if node then
  862. if not node:isAlarm() and msg.leftNum==1 then
  863. if self:getMode()==0 then
  864. if node:getInfo().viewPos==2 then PdkSoundHelper:single( node:getInfo().sex ) end
  865. elseif self:getMode()==1 then
  866. if node:getInfo().viewPos==3 then PdkSoundHelper:single( node:getInfo().sex ) end
  867. end
  868. end
  869. node:showLeft(msg.leftNum)
  870. end
  871. if viewPos == 1 then--判断是否自己出牌
  872. self:showTurnBtn(false)
  873. for _,v in pairs(msg.cards) do
  874. self:removeCardNode(v)
  875. end
  876. if msg.leftNum==1 then
  877. PdkSoundHelper:single( node:getInfo().sex )
  878. end
  879. --还原不可点
  880. self:downCanotOuts(self:getHandCards(), false)
  881. self:resetCardsPos()
  882. else
  883. self:removeOtherCards(viewPos, msg.cards)
  884. end
  885. -----------
  886. -- local d = self:getTurnData(false)
  887. -- if d then
  888. -- local msg = d
  889. -- if self.lastOutFlag ~= 0 then--连续两次要不起要间隔
  890. -- if msg.opType == 0 then
  891. -- self:stopTurn(false)
  892. -- self:startTurns()
  893. -- return
  894. -- end
  895. -- end
  896. -- end
  897. end
  898. -- 玩家自己显示要不起
  899. function PdkRoomView:showPass()
  900. self.ui.Items.imgTip:setOpacity(0)
  901. self.ui.Items.imgTip:setVisible(true)
  902. local ac = cc.Sequence:create(cc.FadeIn:create(0.2), cc.DelayTime:create(1), cc.FadeOut:create(0.2))
  903. self.ui.Items.imgTip:runAction(ac)
  904. --手牌变暗
  905. local anFunc = function ()
  906. for k,v in pairs(self._selfCards) do
  907. v:setNoTouch(true)
  908. end
  909. end
  910. local mingFunc = function ()
  911. for k,v in pairs(self._selfCards) do
  912. v:setNoTouch(false)
  913. end
  914. end
  915. local ac = cc.Sequence:create(cc.CallFunc:create(anFunc), cc.DelayTime:create(0.1), cc.CallFunc:create(mingFunc))
  916. self.cardRoot:runAction(ac)
  917. end
  918. -- cards@单张或者对子需要
  919. function PdkRoomView:showEffect( viewPos, effectType, dltWidth, cards, isContinue )
  920. if dltWidth == nil then
  921. dltWidth = 50
  922. end
  923. local rate = math.random(100)
  924. local stdRate = 70
  925. isContinue = isContinue or false
  926. local pNode = self:getPlayerNodeVpos(viewPos)
  927. if pNode==nil then return end
  928. local pInfo = pNode:getInfo()
  929. local sex = pInfo.sex
  930. local node = nil
  931. if effectType == ETS.PASS then
  932. local cb = function ()
  933. local node = self:getPlayerNodeVpos(viewPos)
  934. if node then node:setTurn(false) end
  935. end
  936. node = PdkEffectHelper:getPass(cb)
  937. local idx = math.random(4)
  938. PdkSoundHelper:effectPass( sex, idx )
  939. elseif effectType == ETS.SINGLE_CARD then
  940. local _, val = pokerParse(cards[1])
  941. PdkSoundHelper:effectSingle( sex ,val )
  942. elseif effectType == ETS.DUI_ZI then
  943. local _, val = pokerParse(cards[1])
  944. if isContinue and rate >= stdRate and PdkSoundHelper:getLanguageType() == 1 then
  945. PdkSoundHelper:daNi( sex )
  946. else
  947. PdkSoundHelper:effectDouble( sex, val )
  948. end
  949. elseif effectType == ETS.SHUN_ZI then
  950. node = PdkEffectHelper:getShunzi()
  951. if viewPos==1 and node then
  952. node:setScale(1.2)
  953. end
  954. if isContinue and rate>=stdRate and PdkSoundHelper:getLanguageType() == 1 then
  955. PdkSoundHelper:daNi( sex )
  956. else
  957. PdkSoundHelper:effectShunzi( sex )
  958. end
  959. elseif effectType == ETS.LIAN_DUI then
  960. node = PdkEffectHelper:getLiandui()
  961. if isContinue and rate>=stdRate and PdkSoundHelper:getLanguageType() == 1 then
  962. PdkSoundHelper:daNi( sex )
  963. else
  964. PdkSoundHelper:effectLiandui( sex )
  965. end
  966. elseif effectType == ETS.THREE_AND_TWO or effectType == ETS.THREE_AND_DUI or effectType == ETS.THREE then
  967. --根据牌获取是否是三带一或三个
  968. local tp = PokerUtil:checkType(cards)
  969. if tp == ETS.THREE_AND_ONE then
  970. node = PdkEffectHelper:getSandaiyi()
  971. PdkSoundHelper:effect3And1( sex )
  972. elseif tp == ETS.THREE_AND_TWO or tp == ETS.THREE_AND_DUI then
  973. node = PdkEffectHelper:getSandaier()
  974. if isContinue and rate>=stdRate and PdkSoundHelper:getLanguageType() == 1 then
  975. PdkSoundHelper:daNi( sex )
  976. else
  977. PdkSoundHelper:effect3And2( sex,effectType )
  978. end
  979. elseif tp == ETS.THREE then
  980. local _, val = pokerParse(cards[1])
  981. PdkSoundHelper:effectThree( sex, val )
  982. end
  983. elseif effectType == ETS.FOUR_AND_THREE then
  984. node = PdkEffectHelper:getSidaisan()
  985. PdkSoundHelper:effect4And3( sex )
  986. elseif effectType == ETS.BOMB then
  987. node = PdkEffectHelper:getBomb()
  988. PdkSoundHelper:effectBomb( sex )
  989. elseif effectType == ETS.AIRPLANE or effectType == ETS.AIRPLANE_TOW or effectType == ETS.AIRPLANE_DUI then
  990. node = PdkEffectHelper:getPlan()
  991. PdkSoundHelper:effectPlane( sex )
  992. elseif effectType == ETS.FOUR_AND_ONE then --四带一
  993. node = PdkEffectHelper:getSidaiyi()
  994. PdkSoundHelper:effect4And1( sex )
  995. --[[ elseif effectType == ETS.SPRING_HUA then
  996. node = PdkEffectHelper:getSpring()--]]
  997. end
  998. if node then
  999. local pt = clone(PdkRoomViewConfig.SHOW_CARD_POS[self:getMode()][viewPos])
  1000. if self:getMode() >= 2 then
  1001. pt = clone(PdkRoomViewConfig.RECORD_SHOW_CARD_POS4[self:getMode()][viewPos])
  1002. end
  1003. if effectType~=ETS.PASS then
  1004. if effectType==ETS.SHUN_ZI then
  1005. if viewPos == 2 then
  1006. -- if self:getMode()==0 then
  1007. -- pt.x = pt.x
  1008. -- else
  1009. pt.x = pt.x - dltWidth*2
  1010. -- end
  1011. elseif viewPos == 3 then
  1012. pt.x = pt.x
  1013. else
  1014. pt.x = pt.x-50
  1015. pt.y = 320*g_radio_y
  1016. end
  1017. else
  1018. if viewPos == 2 then
  1019. -- if self:getMode()==0 then
  1020. -- pt.x = pt.x + dltWidth
  1021. -- else
  1022. pt.x = pt.x - dltWidth
  1023. -- end
  1024. elseif viewPos == 3 or viewPos == 4 then
  1025. pt.x = pt.x + dltWidth
  1026. end
  1027. end
  1028. pt.y = pt.y - (PdkRoomViewConfig.CARD_HEIGHT/5*1)*PdkRoomViewConfig.CARD_SCALE[2]
  1029. if effectType==ETS.BOMB then
  1030. pt.y = (pt.y+120)*g_radio_y
  1031. end
  1032. if viewPos == 1 then
  1033. pt.x = CENTER_X
  1034. pt.y = 300*g_radio_y
  1035. end
  1036. else
  1037. pt.y = pt.y + 40
  1038. if effectType==ETS.PASS then
  1039. if viewPos == 1 then
  1040. pt.y = 300*g_radio_y--自己pass位置调整
  1041. pt.x = CENTER_X
  1042. else
  1043. if viewPos == 2 then --and self:getMode()==1
  1044. pt.x = pt.x-80
  1045. pt.y = (pt.y + 50)*g_radio_y
  1046. end
  1047. pt.y = (pt.y - 50)*g_radio_y
  1048. end
  1049. end
  1050. end
  1051. node:setPosition(pt)
  1052. self:addChild(node)
  1053. if node.onEnter and type(node.onEnter)=='function' then
  1054. node:onEnter()
  1055. end
  1056. end
  1057. end
  1058. function PdkRoomView:cleanOtherHands()
  1059. for _,hands in ipairs(self._otherCards) do
  1060. for _,node in ipairs(hands) do
  1061. if node and node.getParent and node:getParent() then
  1062. node:removeFromParent()
  1063. end
  1064. end
  1065. end
  1066. self._otherCards = {{}, {}, {}, {}}
  1067. end
  1068. -- 游戏单局结算
  1069. function PdkRoomView:onResponseGameResult( data )
  1070. if self._gameResult==true then
  1071. return
  1072. end
  1073. self.ui.Items.btnPlay.play = false
  1074. self.ui.Items.btnPlay:loadTextureNormal("record_play.png", 1)
  1075. self:stopTurn(false)
  1076. self._playStart = false
  1077. self._gameResult = true
  1078. local msg = data.response
  1079. for _,v in pairs(msg.players) do
  1080. local node = self:getPlayerNode(v.userId)
  1081. if node then
  1082. node:setScore(v.totalScore)
  1083. node:setTurn(false)
  1084. end
  1085. node:hideLeft()
  1086. end
  1087. end
  1088. -- 总结算
  1089. function PdkRoomView:onResponseGameOver( data )
  1090. local msg = data.response
  1091. for _,player in ipairs(msg.players) do
  1092. local pdata = self._room:getPlayer(player.userId)
  1093. player.unionid = pdata.unionid
  1094. player.headimgurl = pdata.headimgurl
  1095. player.gpsInfo = pdata.gpsInfo
  1096. player.sex = pdata.sex
  1097. player.openid = pdata.openid
  1098. player.nickname = pdata.nickname
  1099. player.areano = pdata.areano
  1100. end
  1101. -- 缓存结算信息
  1102. self._isGameOver = true
  1103. self._gameOverData = msg
  1104. local roomInfo = self.roomInfo
  1105. self._gameOverData.nShowTableId = roomInfo.nTableId
  1106. self._gameOverData.startCount = roomInfo.nGameStartCount
  1107. self._gameOverData.totalCount = roomInfo.nTotalGameNum
  1108. self._gameOverData.roomRule = self:getRuleString()
  1109. if self._gameResult==false then--已经展示过小结算后解散房间
  1110. self:onNormalShowGameOver()
  1111. end
  1112. end
  1113. --[[先显示小局结算,再显示总结算--]]
  1114. function PdkRoomView:onNormalShowGameOver( data )
  1115. self._gameResult = false
  1116. local showFunc = function (msg)
  1117. local view = import("pk_hejiangpdk.luaScript.Views.Room.Sub.hejiangPdkGameOverView"):new(msg)
  1118. view:setAnchorPoint(cc.p(0.5, 0.5))
  1119. app:showWaitDialog(view)
  1120. end
  1121. if self._isGameOver and self._gameOverData then
  1122. showFunc(self._gameOverData)
  1123. end
  1124. end
  1125. ----------------------------------------------------------------------------------------------------------------------
  1126. ----------------------------------------------------------------------------------------------------------------------
  1127. -- 单局结算显示剩余牌
  1128. function PdkRoomView:showLeftCards( pos, cards )
  1129. self:showTurnBtn(false)
  1130. if #cards <=0 then return end
  1131. self:clearPosShow(pos)
  1132. if pos==2 then --self:getMode()==1 and
  1133. local tmp = {}
  1134. for _,v in ipairs(cards) do
  1135. table.insert(tmp, 1, v)
  1136. end
  1137. cards = tmp
  1138. end
  1139. local scaleWdt = PdkRoomViewConfig.CARD_DLT_WIDTH*PdkRoomViewConfig.CARD_SCALE[2]
  1140. local root = cc.Node:create()
  1141. local nodes = {}
  1142. for i,card in ipairs(cards) do
  1143. local node = self:genCard(card)
  1144. local pt = cc.p(0, 0)
  1145. if pos==1 then --self:getMode() == 0 or
  1146. pt.x = pt.x + (i-1)*scaleWdt
  1147. node:setLocalZOrder(100+i)
  1148. else
  1149. if i>=9 then
  1150. pt.y = pt.y - 80
  1151. if pos ~= 2 then
  1152. pt.x = pt.x + (i-math.floor(i/9)*9)*scaleWdt
  1153. else
  1154. pt.x = pt.x - (i-math.floor(i/9)*9)*scaleWdt
  1155. node:setLocalZOrder(36-i)
  1156. end
  1157. else
  1158. if pos ~= 2 then
  1159. pt.x = pt.x + (i-math.floor(i/9)*9-1)*scaleWdt
  1160. else
  1161. pt.x = pt.x - (i-math.floor(i/9)*9-1)*scaleWdt
  1162. node:setLocalZOrder(16-i)
  1163. end
  1164. end
  1165. end
  1166. node:setScale(PdkRoomViewConfig.CARD_SCALE[2])
  1167. node:setPosition(pt)
  1168. root:addChild(node)
  1169. node:setVisible(false)
  1170. table.insert(nodes, node)
  1171. end
  1172. local dltWidth = 0
  1173. local rpt = clone(PdkRoomViewConfig.SHOW_CARD_POS[self:getMode()][pos])
  1174. if pos == 1 then
  1175. rpt.x = 200
  1176. rpt.y = 110
  1177. else
  1178. dltWidth = #cards/2*scaleWdt
  1179. end
  1180. root:setPosition(rpt)
  1181. self.cardRoot:addChild(root)
  1182. table.insert(self._showCards[pos], root)
  1183. for i,v in ipairs(nodes) do
  1184. v:runAction(cc.Sequence:create(cc.DelayTime:create((i-1)*0.05), cc.CallFunc:create(function ()
  1185. v:setVisible(true)
  1186. end)))
  1187. end
  1188. end
  1189. -- 根据位置显示一组牌 cards@出牌牌组 pos@出牌视角位置 tp@出牌的类型isContinue@是否接牌
  1190. function PdkRoomView:showCards( cards, pos, tp, isContinue )
  1191. self:clearPosShow(pos)
  1192. self._lastCards =cards
  1193. self._lastOutType = tp
  1194. if pos==2 then -- self:getMode()==1 and
  1195. local tmp = {}
  1196. for _,v in ipairs(cards) do
  1197. table.insert(tmp, 1, v)
  1198. end
  1199. cards = tmp
  1200. end
  1201. local root = cc.Node:create()
  1202. local scale = PdkRoomViewConfig.CARD_SCALE[2]
  1203. local allCount = #cards
  1204. for i,card in ipairs(cards) do
  1205. local node = self:genCard(card)
  1206. local pt = cc.p(0, 0)
  1207. if pos == 1 then
  1208. local midIdx = allCount/2
  1209. if i<midIdx then--左边
  1210. pt.x = 0 - (midIdx-i-1)*PdkRoomViewConfig.CARD_DLT_WIDTH*scale
  1211. else--右边
  1212. pt.x = 0 + (i-midIdx+1)*PdkRoomViewConfig.CARD_DLT_WIDTH*scale
  1213. end
  1214. pt.x = pt.x - PdkRoomViewConfig.CARD_WIDTH/2*scale
  1215. else
  1216. if pos ==2 then -- self:getMode()==1 and
  1217. node:setLocalZOrder(16-i)
  1218. pt.x = pt.x - (i-1)*PdkRoomViewConfig.CARD_DLT_WIDTH*scale
  1219. else
  1220. pt.x = pt.x + (i-1)*PdkRoomViewConfig.CARD_DLT_WIDTH*scale
  1221. end
  1222. end
  1223. node:setScale(scale)
  1224. node:setPosition(pt)
  1225. root:addChild(node)
  1226. end
  1227. local dltWidth = 0
  1228. local rpt = clone(PdkRoomViewConfig.SHOW_CARD_POS[self:getMode()][pos])
  1229. if self:getMode() >= 2 then
  1230. rpt = clone(PdkRoomViewConfig.RECORD_SHOW_CARD_POS4[self:getMode()][pos])
  1231. end
  1232. if pos == 1 then
  1233. rpt = cc.p(CENTER_X, 320*g_radio_y)
  1234. else
  1235. dltWidth = math.floor(#cards/2)*PdkRoomViewConfig.CARD_DLT_WIDTH*scale
  1236. end
  1237. root:setPosition(rpt)
  1238. self.cardRoot:addChild(root)
  1239. table.insert(self._showCards[pos], root)
  1240. --牌型动画
  1241. self:showEffect(pos, tp, dltWidth, cards, isContinue)
  1242. end
  1243. -- 清除某玩家的出牌
  1244. function PdkRoomView:clearPosShow(pos)
  1245. local nodes = self._showCards[pos]
  1246. for _,v in ipairs(nodes) do
  1247. if v:getParent() then v:removeFromParent() end
  1248. end
  1249. self._showCards[pos] = {}
  1250. end
  1251. -- 添加玩家节点
  1252. function PdkRoomView:addPlayerNode( pInfo )
  1253. local node = self._playerNodes[tonumber(pInfo.userId)]
  1254. if node then return end
  1255. node = PdkPlayerNode:new()
  1256. local rule = self._room:getRoomInfo().specialRule
  1257. local allowPass = self._room:getRoomInfo().allowPass
  1258. node:setGameInfo(json.encode({allowPass=allowPass}))
  1259. node:setMaxPlayerCount(self._room:getRoomInfo().nMaxPlayCount)
  1260. node:setShowNum(getNumBand(rule, 0x0020)>0)--是否显示牌张数
  1261. node:setInfo(pInfo)
  1262. node:setReady(pInfo.playFlag==1)
  1263. node:setHost(pInfo.userId==self.roomInfo.nRoomOwnedUid)
  1264. node:setPosition(PdkRoomViewConfig.PLAYER_POS[self:getMode()][pInfo.viewPos])
  1265. self._playerNodes[pInfo.userId] = node
  1266. node:setLocalZOrder(10)
  1267. self.ui.Items.toolPanel:getParent():addChild(node)
  1268. end
  1269. -- 删除玩家节点
  1270. function PdkRoomView:delPlayerNode( uid )
  1271. if self._gameResult or self._isGameOver then return end
  1272. local node = self._playerNodes[uid]
  1273. if not node then return end
  1274. node:removeFromParent()
  1275. self._playerNodes[uid] = nil
  1276. end
  1277. -- 获取玩家节点
  1278. function PdkRoomView:getPlayerNode( uid )
  1279. return self._playerNodes[tonumber(uid)]
  1280. end
  1281. -- 根据视图获取玩家节点
  1282. function PdkRoomView:getPlayerNodeVpos( viewPos )
  1283. for _,v in pairs(self._playerNodes) do
  1284. if v:getInfo().viewPos==viewPos then
  1285. return v
  1286. end
  1287. end
  1288. return nil
  1289. end
  1290. -- 发牌
  1291. function PdkRoomView:sendCards( cards_, pos )
  1292. local cards = pokerSortPdkCards(cards_)
  1293. local CardsCount = #cards
  1294. for i,card in ipairs(cards) do
  1295. local ac = cc.Sequence:create(cc.DelayTime:create(i*0.05), cc.CallFunc:create(function ()
  1296. self:sendOneCard(card.cid, i, pos, i==CardsCount, CardsCount)
  1297. if self:getMode()==0 then
  1298. -- if i==CardsCount then self:showOtherCards(true) end
  1299. end
  1300. end))
  1301. self.cardRoot:runAction(ac)
  1302. end
  1303. end
  1304. -- 发一张牌
  1305. function PdkRoomView:sendOneCard( card, i, pos, islast, allCount )
  1306. -- local node = self:genCard(card)
  1307. local node = self:genCard(-1)--back
  1308. node.cid = card
  1309. node:setScale(PdkRoomViewConfig.CARD_SCALE[pos])--PdkRoomViewConfig.CARD_SCALE_START
  1310. node:setLast(islast)
  1311. local endX = CENTER_X + (allCount-allCount/2+1)*PdkRoomViewConfig.CARD_DLT_WIDTH*PdkRoomViewConfig.CARD_SCALE[1]
  1312. local pt = cc.p(0, 0)
  1313. local mode = self:getMode()
  1314. local otherScale = 0.4
  1315. if pos ~= 1 then
  1316. node:setScale(otherScale)
  1317. pt = clone(PdkRoomViewConfig.CARD_POS[mode][pos])
  1318. -- if mode==0 then--两人
  1319. -- pt.x = pt.x + i*PdkRoomViewConfig.CARD_DLT_WIDTH*otherScale
  1320. -- node:setLocalZOrder(i)
  1321. -- else--三人
  1322. if pos == 2 then
  1323. pt.x = pt.x - i*PdkRoomViewConfig.CARD_DLT_WIDTH*otherScale
  1324. node:setLocalZOrder(16-i)
  1325. else
  1326. pt.x = pt.x + i*PdkRoomViewConfig.CARD_DLT_WIDTH*otherScale
  1327. node:setLocalZOrder(i)
  1328. end
  1329. -- end
  1330. else
  1331. pt.x = CENTER_X
  1332. local midIdx = allCount/2
  1333. if i<=midIdx then--左边
  1334. pt.x = pt.x - (midIdx-i-1)*PdkRoomViewConfig.CARD_DLT_WIDTH*PdkRoomViewConfig.CARD_SCALE[1]
  1335. else--右边
  1336. pt.x = pt.x + (i-midIdx+1)*PdkRoomViewConfig.CARD_DLT_WIDTH*PdkRoomViewConfig.CARD_SCALE[1]
  1337. end
  1338. pt.x = pt.x - PdkRoomViewConfig.CARD_WIDTH/2*PdkRoomViewConfig.CARD_SCALE[1]
  1339. pt.y = PdkRoomViewConfig.CARD_POS[mode][pos].y
  1340. node:setLocalZOrder(i)
  1341. end
  1342. node:setPosition(cc.p(endX, pt.y))
  1343. node:setOpacity(0)
  1344. self.cardRoot:addChild(node)
  1345. local ac = nil
  1346. if pos ~=1 then
  1347. ac = cc.Sequence:create(cc.Spawn:create(cc.MoveTo:create(0.1, pt), cc.FadeIn:create(0.1)), cc.CallFunc:create(function ()
  1348. table.insert(self._otherCards[pos], node)
  1349. PdkSoundHelper:playSend()
  1350. end), cc.DelayTime:create((allCount-i)*0.08), cc.CallFunc:create(function() node:setCard(node.cid) end ))
  1351. node:runAction(ac)
  1352. else
  1353. ac = cc.Sequence:create(cc.Spawn:create(cc.MoveTo:create(0.1, pt), cc.FadeIn:create(0.1)), cc.CallFunc:create(function ()
  1354. table.insert(self._selfCards, node)
  1355. PdkSoundHelper:playSend()
  1356. end), cc.DelayTime:create((allCount-i)*0.08), cc.CallFunc:create(function() node:setCard(node.cid) end ))
  1357. node:runAction(ac)
  1358. end
  1359. end
  1360. -- 发一张牌没有动画
  1361. function PdkRoomView:sendOneCardNoAct( card, i, pos, islast, allCount )
  1362. local node = self:genCard(card)
  1363. node:setScale(PdkRoomViewConfig.CARD_SCALE[pos])
  1364. node:setLast(islast)
  1365. local pt = cc.p(0, 0)
  1366. if pos ~= 1 then
  1367. pt = clone(PdkRoomViewConfig.CARD_POS[self:getMode()][pos])
  1368. else
  1369. local midIdx = math.floor(allCount/2)
  1370. if i<midIdx then--左边
  1371. pt.x = CENTER_X - (midIdx-i-1)*PdkRoomViewConfig.CARD_DLT_WIDTH*PdkRoomViewConfig.CARD_SCALE[pos]
  1372. else--右边
  1373. pt.x = CENTER_X + (i-midIdx+1)*PdkRoomViewConfig.CARD_DLT_WIDTH*PdkRoomViewConfig.CARD_SCALE[pos]
  1374. end
  1375. pt.x = pt.x - PdkRoomViewConfig.CARD_WIDTH/2*PdkRoomViewConfig.CARD_SCALE[pos]
  1376. pt.y = PdkRoomViewConfig.CARD_POS[1][pos].y
  1377. end
  1378. node:setPosition(pt)
  1379. node:setLocalZOrder(i)
  1380. self.cardRoot:addChild(node)
  1381. table.insert(self._selfCards, node)
  1382. end
  1383. -- 创建一张牌
  1384. function PdkRoomView:genCard( card )
  1385. local node = PdkCardNode:new()
  1386. node:setCard(card)
  1387. node:setSelectedHeight(PdkRoomViewConfig.SELECTED_HEIGHT)
  1388. node:setNormalHeight(PdkRoomViewConfig.NORMAL_HEIGHT)
  1389. return node
  1390. end
  1391. -- 从手牌中获取一张牌
  1392. function PdkRoomView:getCardNode( card )
  1393. if card > 0x00 and card <= 0x3d then
  1394. for _,v in pairs(self._selfCards) do
  1395. if v:getVal()==card then return v end
  1396. end
  1397. return nil
  1398. else
  1399. return nil
  1400. end
  1401. end
  1402. -- 根据牌ID移除一张手牌,并重新调整手牌位置
  1403. function PdkRoomView:removeCardNode( card )
  1404. local node = self:getCardNode(card)
  1405. if not node then return end
  1406. for i=#self._selfCards,1,-1 do
  1407. if self._selfCards[i]:getVal()==card then
  1408. table.remove(self._selfCards, i)
  1409. break
  1410. end
  1411. end
  1412. node:removeFromParent()
  1413. --reset pos
  1414. self:resetCardsPos()
  1415. end
  1416. -- 移除牌
  1417. function PdkRoomView:removeOtherCards( viewPos, cards )
  1418. local nodeSet = self._otherCards[viewPos]
  1419. for _,card in ipairs(cards) do
  1420. if card > 0x00 and card <= 0x3d then
  1421. for _,v in pairs(nodeSet) do
  1422. if v:getVal()==card then
  1423. for i=#nodeSet,1,-1 do
  1424. if nodeSet[i]:getVal()==card then
  1425. table.remove(nodeSet, i)
  1426. break
  1427. end
  1428. end
  1429. v:removeFromParent()
  1430. end
  1431. end
  1432. end
  1433. end
  1434. local pos = viewPos
  1435. local mode = self:getMode()
  1436. local otherScale = 0.4
  1437. for i,v in ipairs(nodeSet) do
  1438. local pt = cc.p(0, 0)
  1439. if pos ~= 1 then
  1440. pt = clone(PdkRoomViewConfig.CARD_POS[mode][pos])
  1441. -- if mode==0 then--两人
  1442. -- pt.x = pt.x + i*PdkRoomViewConfig.CARD_DLT_WIDTH*otherScale
  1443. -- v:setLocalZOrder(i)
  1444. -- else--三人
  1445. if pos == 2 then
  1446. pt.x = pt.x - i*PdkRoomViewConfig.CARD_DLT_WIDTH*otherScale
  1447. v:setLocalZOrder(16-i)
  1448. else
  1449. pt.x = pt.x + i*PdkRoomViewConfig.CARD_DLT_WIDTH*otherScale
  1450. v:setLocalZOrder(i)
  1451. end
  1452. -- end
  1453. v:setPosition(pt)
  1454. end
  1455. end
  1456. end
  1457. -- 获取当前手牌
  1458. function PdkRoomView:getHandCards()
  1459. local handCards = {}
  1460. for _,v in pairs(self._selfCards) do
  1461. table.insert(handCards, v:getVal())
  1462. end
  1463. return handCards
  1464. end
  1465. -- 重置手牌位置
  1466. function PdkRoomView:resetCardsPos( )
  1467. if #self._selfCards<=0 then return end
  1468. local mode = self:getMode()
  1469. local pos = 1
  1470. local scale = PdkRoomViewConfig.CARD_SCALE[pos]
  1471. local dtpx = (16 - #self._selfCards)/2*PdkRoomViewConfig.CARD_DLT_WIDTH*scale
  1472. local allCount = #self._selfCards
  1473. local midIdx = allCount/2
  1474. for i,v in ipairs(self._selfCards) do
  1475. local pt = cc.p(CENTER_X, 0)
  1476. if i<midIdx then--左边
  1477. pt.x = pt.x - (midIdx-i-1)*PdkRoomViewConfig.CARD_DLT_WIDTH*scale
  1478. else--右边
  1479. pt.x = pt.x + (i-midIdx+1)*PdkRoomViewConfig.CARD_DLT_WIDTH*scale
  1480. end
  1481. pt.x = pt.x - PdkRoomViewConfig.CARD_WIDTH/2*scale
  1482. pt.y = PdkRoomViewConfig.CARD_POS[self:getMode()][pos].y
  1483. v:setPosition(pt)
  1484. v:setLast(i==allCount)
  1485. v:setNormal()
  1486. end
  1487. end
  1488. -- 提示对应的牌
  1489. function PdkRoomView:tipCards( cards )
  1490. self:resetCardsPos()
  1491. for _,v in pairs(cards) do
  1492. local node = self:getCardNode(v.cid)
  1493. if node and node:getVal()>0 then
  1494. self._selectCards[node:getVal()] = node
  1495. node:setDown()
  1496. end
  1497. end
  1498. end
  1499. -- 清除所有牌
  1500. function PdkRoomView:cleanSelfCards()
  1501. for _,v in pairs(self._selfCards) do
  1502. if v:getParent() then v:removeFromParent() end
  1503. end
  1504. self._selfCards = {}
  1505. end
  1506. function PdkRoomView:cleanShowCards()
  1507. for _,v in pairs(self._showCards) do
  1508. for _,vv in pairs(v) do
  1509. if vv and vv:getParent() then
  1510. vv:removeFromParent()
  1511. end
  1512. end
  1513. end
  1514. self._showCards = {{},{},{},{}}
  1515. end
  1516. -- 二人玩显示另外一组牌
  1517. function PdkRoomView:showOtherCards(is)
  1518. if is then
  1519. self.imgOtherCards:setVisible(true)
  1520. local num = 13
  1521. --if self.ruleType==2 then num = 15 end
  1522. self.txtOtherCards:setString(string.format("剩余%d张", num))
  1523. else
  1524. self.imgOtherCards:setVisible(false)
  1525. end
  1526. end
  1527. function PdkRoomView:onEnter()
  1528. PdkRoomView.super.onEnter()
  1529. PokerUtil = require("pk_hejiangpdk.luaScript.Views.Room.hejiangPokerUtil"):new({isChai=self.ruleIsChaiBomb, isFAT=self.ruleIsFAT})
  1530. self:bindEvents()
  1531. local changeDesk = tonumber(loadUserInfo("hjpdk_setting_bg_idx")) or 2
  1532. self:onNormalChangeDesktop({idx=changeDesk-1})
  1533. PdkSoundHelper:playBgMusic()
  1534. local roomInfo = self._room:getRoomInfo()
  1535. 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 ))
  1536. -- 默认开始回放
  1537. self:onClickButtonPlay( self.ui.Items.btnPlay, 1 )
  1538. end
  1539. function PdkRoomView:onExit()
  1540. if self.Time then
  1541. cc.Director:getInstance():getScheduler():unscheduleScriptEntry(self.Time)
  1542. self.Time = nil
  1543. end
  1544. if self._gameResultTimer then
  1545. cc.Director:getInstance():getScheduler():unscheduleScriptEntry(self._gameResultTimer)
  1546. self._gameResultTimer = nil
  1547. end
  1548. for _,node in pairs(self._playerNodes) do
  1549. if node then node:setTurn(false) end
  1550. end
  1551. self:stopTurn()
  1552. PokerUtil = nil
  1553. stopBGMusic()
  1554. end
  1555. return PdkRoomView