তুরুপ ২৯ · Turup 29 — anti-clockwise rotation proof

Commit c1574bf · Bundle index-DI0TvAs9.js · Captured 20260529-1431
Visual rotation: ✅ ANTI-CLOCKWISE confirmed
Expected (CCW): bottom=You, right=Aniruddho, top=Rohini, left=Pritam · engine P1→P2→P3→P4 traces bottom → right → top → left

Per-viewport seat positions

568x320 — 568×320

Screen positionSeat labelBounding box (x,y,w,h)
bottomYou105,245,70,56
rightAniruddho475,150,68,56
topRohini249,48,70,56
leftPritam25,150,68,56
screenshot at 568x320

667x375 — 667×375

Screen positionSeat labelBounding box (x,y,w,h)
bottomYou122,285,83,66
rightAniruddho560,173,80,66
topRohini292,52,83,66
leftPritam27,173,80,66
screenshot at 667x375

740x360 — 740×360

Screen positionSeat labelBounding box (x,y,w,h)
bottomYou163,275,81,64
rightAniruddho590,166,78,64
topRohini330,48,81,64
leftPritam71,166,78,64
screenshot at 740x360

812x375 — 812×375

Screen positionSeat labelBounding box (x,y,w,h)
bottomYou189,287,85,67
rightAniruddho637,172,82,67
topRohini364,48,85,67
leftPritam92,172,82,67
screenshot at 812x375

844x390 — 844×390

Screen positionSeat labelBounding box (x,y,w,h)
bottomYou195,298,89,71
rightAniruddho665,178,86,71
topRohini377,48,89,71
leftPritam94,178,86,71
screenshot at 844x390

896x414 — 896×414

Screen positionSeat labelBounding box (x,y,w,h)
bottomYou204,316,95,76
rightAniruddho708,187,92,76
topRohini400,48,95,76
leftPritam96,187,92,76
screenshot at 896x414

1024x600 — 1024×600

Screen positionSeat labelBounding box (x,y,w,h)
bottomYou187,446,127,101
rightAniruddho859,273,123,101
topRohini448,88,127,101
leftPritam42,273,123,101
screenshot at 1024x600

What this proves

Before this commit, the local Quick-Play adapter buildPlayTableAdapter.ts mapped AntiCWNext(human) to screen-left. The visual rotation P1(bottom) → P2(left) → P3(top) → P4(right) → back to P1 is a clockwise sweep viewed from above, which disagreed with both the real-world Bangla Turup 29 rule and the team's own 2026-05-17 anti-clockwise correction already locked in adaptServerSnapshotToPlayTableState.ts, SLOT_BY_OWNER, and TrickCardModel.position.

The fix swaps left/right in buildSeatPositionMap(): right = AntiCWNext(human), left = AntiCWPrev(human). Visual rotation is now bottom → right → top → left → bottom — true anti-clockwise viewed from above. Engine logic, scoring, deck, redeal paths, and bidding rules are all unchanged (500-hand bot smoke: 500/500 pass, 0 errors).