麻将牌堆渲染(Lua)

麻将牌堆渲染(Lua) 麻将牌堆渲染Lua用法-- 牌堆localnTotalRemainingtData.nRemainingCountor0localtDicetData.tDiceor{0,0}localtWallMahjongUI_CalcWallTiles(tData.nRemainingCount,tData.tDice)fornDir1,4dolocalnAbsSeat((nMySeat-1nDir-1)%4)1MahjongUI_UpdateMaPai(nDir,tWall[nAbsSeat],26)end实现localMAHJONG_TOTAL_TILES108-- 总牌数万条筒各1-9×4localMAHJONG_TILES_PER_WALL27-- 每方墙 108/4 27 张--- 根据骰子点数和剩余张数计算4方墙各显示多少张--- 牌墙是连续一整条从切牌位顺时针顺序消耗剩余显示在对应墙--- param nRemainingCount number 剩余总张数--- param tDice table|nil 骰子数组 {d1, d2}nil时均分--- return table tWallTiles[1..4] 每方墙张数functionMahjongUI_CalcWallTiles(nRemainingCount,tDice)localtWall{0,0,0,0}localRnRemainingCountor0ifR0thenreturntWallendlocalnCutWall1localnDeadCards0iftDiceandtDice[1]andtDice[2]andnot(tDice[1]0andtDice[2]0)thenlocalnSumtDice[1]tDice[2]nCutWall((nSum-1)%4)1nDeadCards(nSum-1)*2end-- 1. 切牌墙先放死牌localnDeadmath.min(nDeadCards,R)tWall[nCutWall]nDead RR-nDeadifR0thenreturntWallend-- 2. 顺时针分配下家-对家-上家localMAX_PER_WALL26localORDER{[1]2,[2]3,[3]4,[4]1}localnIdxnCutWallwhileR0donIdxORDER[nIdx]localnCanAddMAX_PER_WALL-tWall[nIdx]localnAddmath.min(nCanAdd,R)tWall[nIdx]tWall[nIdx]nAdd RR-nAddifnCanAdd0thenbreakendendifR0thentWall[nCutWall]tWall[nCutWall]RendifMAHJONG_DEBUGthenmodule_mahjong.MJLOGT(CalcWallTiles: result%s,toString(tWall))endreturntWallend--- 根据骰子计算每方墙初始牌数发牌后剩余56张--- param tDice table 骰子点数--- return table[4] 每方墙初始牌数functionMahjongUI_GetInitWallTiles(tDice)returnMahjongUI_CalcWallTiles(56,tDice)end-- _UpdateMaPai_Unified -- 统一牌墙渲染带详细日志localfunction_UpdateMaPai_Unified(nDir,wndMaPai,nTiles,nCutSeat,nDiceSum)localszTemplateMAPAI_TEMPLATES[nDir]localMAX_PILES13localbIsCutWall(nDirnCutSeat)localnDeadPilesbIsCutWalland(nDiceSum-1)or0localnDeadCardsnDeadPiles*2localnEffMaxPilesMAX_PILES-nDeadPileslocalnEffectiveTilesmath.max(0,nTiles-nDeadCards)localnRemainingPilesmath.ceil(nEffectiveTiles/2)localbPartial(nEffectiveTiles0)and(nEffectiveTiles%21)localnConsumednEffMaxPiles-nRemainingPiles-- 入口方向仅本家入口在索引13其他三家入口在索引1localbEntryAtHigh(nDir1ornDir4)ifMAHJONG_DEBUGthenmodule_mahjong.MJLOGT(_UpdateMaPai_Unified: dir%d, tiles%d, isCut%s, deadPiles%d, effTiles%d, remainPiles%d, consumed%d, partial%s,nDir,nTiles,tostring(bIsCutWall),nDeadPiles,nEffectiveTiles,nRemainingPiles,nConsumed,tostring(bPartial))endlocaltCutWalls{}fori1,MAX_PILESdolocalnIdxi-- 控件从左到右创建-- 计算该位置在消耗方向上的逻辑序号1 入口端localnPosifbEntryAtHighthennPosMAX_PILES-i1-- 本家索引13对应位置1入口elsenPosi-- 其他索引1对应位置1入口endlocalbPH,bIsPartialifnPosnDeadPilesthenbPH,bIsPartialfalse,falseelseifnPosnDeadPilesnConsumedthenbPH,bIsPartialtrue,falseelseifnPosnDeadPilesnConsumed1andbPartialthenbPH,bIsPartialfalse,trueelsebPH,bIsPartialfalse,falseendlocalwndCardwndMaPai:CreateChildWindowFromTemplate(szTemplate)ifnotwndCardthenbreakendwndCard:SetName(mapai_..tostring(nDir).._..tostring(nIdx))wndCard:Show(true)localcard1wndCard:FindEx(card1)localcard2wndCard:FindEx(card2)card1:Show(true)card2:Show(true)ifbPHthencard1:SetAlpha(0.0)card2:SetAlpha(0.0)elseifbIsPartialthencard1:SetAlpha(1.0)card2:SetAlpha(0.0)elseifbIsCutWallthentable_insert(tCutWalls,wndCard)elsecard1:SetAlpha(1.0)card2:SetAlpha(1.0)endend-- 切牌墙专用二次修正ifbIsCutWalland#tCutWalls0thenlocaltotalCutPilesnDiceSum-1localtotalCutCardstotalCutPiles*2localnDrawnmath.max(0,totalCutCards-nTiles)localnHideFullmath.floor(nDrawn/2)localbCutPartial(nDrawn%21)-- 根据方向决定遍历顺序本家/左家倒序从右到左右家/对家正序从左到右localbReversebEntryAtHigh-- 高位入口的方向采用倒序localnCount#tCutWallsforseq1,nCountdolocalwndCardifbReversethenwndCardtCutWalls[nCount-seq1]-- 倒序elsewndCardtCutWalls[seq]-- 正序endlocalcard1wndCard:FindEx(card1)localcard2wndCard:FindEx(card2)ifseqnHideFullthencard1:SetAlpha(0.0)card2:SetAlpha(0.0)elseifseqnHideFull1andbCutPartialthencard1:SetAlpha(1.0)card2:SetAlpha(0.0)elsecard1:SetAlpha(1.0)card2:SetAlpha(1.0)endendendend-- MahjongUI_UpdateMaPai -- 牌墙渲染入口根据切牌位置分派到固定13墩Fixed13或动态 SC 模板。-- 销毁并重新创建所有牌墙实例。-- 阶段所有阶段初始发牌和游戏中。-- param nDir number 方向 (1-4)-- param nRemainingTiles number 该墙当前剩余牌数-- param nInitTiles number 该墙初始牌数-- return nilfunctionMahjongUI_UpdateMaPai(nDir,nRemainingTiles,nInitTiles)localframeFindWindow(mahjong_main_panel)ifnotframethenreturnendlocalwndMaPaiMahjongUI_FindWindow(frame,wnd_table,list_mapai..tostring(nDir))ifnotwndMaPaithenreturnendlocalnTilesnRemainingTilesor0localnInitnInitTilesor0ifnInit0thenifnDir~1andnDir~2andnDir~3andnDir~4thenreturnendendwndMaPai:DestroyAllChildWindow()localtDicemodule_mahjong.mahjong_client_core.Client_GetData().tDicelocalnDiceSum(tDiceandtDice[1]andtDice[2])and(tDice[1]tDice[2])or0localnCutSeatAbs(nDiceSum0)and((nDiceSum-1)%41)or0localnMySeatMahjongUI_GetMySeat()localnCutSeat(nCutSeatAbs0andnMySeat0)andMahjongUI_GetRelativeSeat(nMySeat,nCutSeatAbs)or0ifMAHJONG_DEBUGthenmodule_mahjong.MJLOGT(UpdateMaPai: nDir%d nCutSeat(abs%d→rel%d) nMySeat%d nTiles%d,nDir,nCutSeatAbs,nCutSeat,nMySeat,nTiles)end-- 统一渲染正式使用_UpdateMaPai_Unified(nDir,wndMaPai,nTiles,nCutSeat,nDiceSum)end