You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1726 lines
50 KiB

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