跳到主内容
paste
bin
.ca
type · paste · share
⌘
K
系列
bin 系列
pastebin.ca
中心
Share text and code with expiry and privacy controls.
imagebin.ca
Upload and share images with direct links.
filebin.ca
Drop a file and get a shareable link.
notebin.ca
Write Markdown notes with durable links.
turl.ca
Short, reputation-checked links.
attn.ca
Notifications and alerts for your services.
voicebin.ca
Record and share short voice clips.
dnsbin.ca
Inspect DNS and debug records.
文档
登录
?
← 返回文本
›
编辑 / 分支
无标题文本
#4SyaU5Y4en
public / public
新版本
匿名
已创建 6 days ago
过期于 1 day
155.0 KB
语法:
text
你的更改会创建一个链接到此文本的新文本 — 原始文本不变。
新版本
你的更改会创建一个链接到此文本的新文本 — 原始文本不变。
标题(可选)
文件名
语法
text
text
bash
c
cpp
css
diff
dockerfile
go
html
ini
java
javascript
json
kotlin
lua
makefile
markdown
nginx
php
python
ruby
rust
shellscript
sql
swift
toml
typescript
xml
yaml
可见性
公开动态
访问
public
过期
7 天
10 分钟
1 小时
1 天
7 天
30 天
90 天
自定义…
自定义过期
变更备注
(可选)
此文本会显示在公开动态中。如果只想通过链接分享,请更改可见性。
创建新版本
取消
粘贴或输入…
{ "version": "4.0.0", "note": "Read-only runtime extraction. No game methods are invoked except the same readLive() inspection used by the previous probe.", "discovery": { "component": "eC", "propsKeys": [ "engine", "placement", "enabled", "spinEnabled" ], "reactFibersVisited": 166, "engineCandidates": 6, "objectCount": 110 }, "objectGraph": [ { "path": "engine", "constructor": "tD", "ownKeys": [ "view", "renderer", "net", "player", "phase", "state", "guideLevel", "soundOn", "aimAngle", "power", "spinX", "spinY", "pullback", "cueAlpha", "prediction", "predictionDirty", "practice", "bih", "foulFlash", "message", "messageKind", "messageId", "lastPotted", "opponentAway", "opponentGone", "shootStart", "strokeAt", "strokeFrom", "strokeMs", "setFor", "shotSentAt", "shotExtra", "shotUnsureAt", "pendingShot", "pendingReplay", "pendingOutcome", "pendingState", "resolveAt", "remoteShot", "remote", "remoteSettled", "viewAngle", "viewPower", "viewSpinX", "viewSpinY", "viewPullback", "aimSentAt", "sentAngle", "sentPower", "sentSpinX", "sentSpinY", "sentCueX", "sentCueY", "sentCharging", "raf", "lastTime", "now", "running", "version", "snapshot", "listeners", "unsubscribe", "pointerId", "dragMode", "controlMode", "sensitivity", "turnLast", "fingerLast", "powerHeld", "watchPrediction", "watchKey", "dragStart", "fineAim", "turnHold", "turnHoldAt", "turnHoldBy", "track", "spaceDown", "spaceStart", "powerBeforeStroke", "myPower", "strokeBase", "strokeMouse", "strokeTravelPx", "wheelCarry", "wheelShowUntil", "wheelUsed", "canvasEl", "subscribe", "getSnapshot", "onFocusLost", "onContextMenu", "onWheel", "onPointerDown", "onPointerMove", "onPointerUp", "onPointerLeave", "onKeyDown", "onKeyUp" ], "prototypeLayers": [ { "layer": 0, "constructor": "tD", "methods": [ { "name": "publish", "length": 93, "selected": false }, { "name": "rel", "length": 45, "selected": false }, { "name": "buildSnapshot", "length": 1212, "selected": true }, { "name": "readLive", "length": 170, "selected": true }, { "name": "attachNetwork", "length": 1530, "selected": true }, { "name": "applyState", "length": 363, "selected": true }, { "name": "enterTurn", "length": 872, "selected": true }, { "name": "canReposition", "length": 182, "selected": true }, { "name": "faceNearestTarget", "length": 330, "selected": true }, { "name": "start", "length": 172, "selected": false }, { "name": "stop", "length": 54, "selected": false }, { "name": "dispose", "length": 96, "selected": false }, { "name": "resize", "length": 66, "selected": true }, { "name": "setGuideLevel", "length": 111, "selected": true }, { "name": "setPractice", "length": 183, "selected": true }, { "name": "setSound", "length": 59, "selected": false }, { "name": "frame", "length": 834, "selected": true }, { "name": "showAim", "length": 63, "selected": true }, { "name": "showCue", "length": 200, "selected": true }, { "name": "blockedTarget", "length": 235, "selected": true }, { "name": "highlightTargets", "length": 186, "selected": false }, { "name": "update", "length": 1654, "selected": true }, { "name": "followOpponent", "length": 673, "selected": true }, { "name": "refreshWatchGuide", "length": 307, "selected": true }, { "name": "watchLevel", "length": 75, "selected": false }, { "name": "broadcastAim", "length": 829, "selected": true }, { "name": "resetAimCache", "length": 149, "selected": true }, { "name": "refreshPrediction", "length": 246, "selected": true }, { "name": "beginSet", "length": 74, "selected": true }, { "name": "setLead", "length": 83, "selected": false }, { "name": "noteShotAnswer", "length": 117, "selected": true }, { "name": "awaitingOwnShot", "length": 100, "selected": true }, { "name": "centreSpin", "length": 39, "selected": true }, { "name": "forgetShot", "length": 79, "selected": true }, { "name": "abandonShot", "length": 334, "selected": true }, { "name": "beginPlayback", "length": 237, "selected": true }, { "name": "consumeEvent", "length": 500, "selected": true }, { "name": "finishPlayback", "length": 387, "selected": true }, { "name": "finishResolve", "length": 140, "selected": true }, { "name": "setMessage", "length": 82, "selected": false }, { "name": "setPower", "length": 131, "selected": true }, { "name": "holdPower", "length": 30, "selected": true }, { "name": "setControlMode", "length": 58, "selected": false }, { "name": "setSensitivity", "length": 78, "selected": false }, { "name": "commitPower", "length": 63, "selected": true }, { "name": "setSpin", "length": 117, "selected": true }, { "name": "nudgeAim", "length": 78, "selected": true }, { "name": "wheelAim", "length": 55, "selected": true }, { "name": "holdFineAim", "length": 224, "selected": true }, { "name": "releaseFineAim", "length": 54, "selected": true }, { "name": "shoot", "length": 843, "selected": true }, { "name": "placeCueBall", "length": 276, "selected": true }, { "name": "placementLegal", "length": 116, "selected": true }, { "name": "rematch", "length": 81, "selected": false }, { "name": "declineRematch", "length": 43, "selected": false }, { "name": "attachInput", "length": 609, "selected": false }, { "name": "detachInput", "length": 637, "selected": false }, { "name": "localPoint", "length": 121, "selected": false }, { "name": "overTable", "length": 61, "selected": true }, { "name": "overCue", "length": 264, "selected": true }, { "name": "overCueBall", "length": 97, "selected": true }, { "name": "beginPlacing", "length": 156, "selected": true }, { "name": "beginStroke", "length": 296, "selected": true }, { "name": "turnAim", "length": 257, "selected": true }, { "name": "followFinger", "length": 298, "selected": true }, { "name": "aimAt", "length": 230, "selected": true }, { "name": "updateBallInHand", "length": 1072, "selected": true } ] } ] }, { "path": "view", "constructor": "tL", "ownKeys": [ "balls", "orthoCounter" ], "prototypeLayers": [ { "layer": 0, "constructor": "tL", "methods": [ { "name": "apply", "length": 150, "selected": true }, { "name": "spin", "length": 898, "selected": true } ] } ] }, { "path": "renderer", "constructor": "tM", "ownKeys": [ "canvas", "effects", "ctx", "sprite", "scale", "originX", "originY", "dpr", "cssW", "cssH", "rotated", "drops", "lastFrame", "spriteTable", "theme" ], "prototypeLayers": [ { "layer": 0, "constructor": "tM", "methods": [ { "name": "resize", "length": 410, "selected": false }, { "name": "syncTheme", "length": 253, "selected": false }, { "name": "ballSkin", "length": 107, "selected": true }, { "name": "toWorld", "length": 118, "selected": false }, { "name": "toScreen", "length": 121, "selected": false }, { "name": "notePot", "length": 78, "selected": false }, { "name": "clearDrops", "length": 33, "selected": false }, { "name": "render", "length": 1263, "selected": true }, { "name": "drawKitchen", "length": 270, "selected": true }, { "name": "drawMotionTrails", "length": 527, "selected": true }, { "name": "drawDrops", "length": 510, "selected": true }, { "name": "drawGuides", "length": 1985, "selected": true }, { "name": "drawBlockedMarker", "length": 469, "selected": true }, { "name": "drawCue", "length": 2322, "selected": true }, { "name": "drawBallInHand", "length": 680, "selected": true } ] } ] }, { "path": "net", "constructor": "tR", "ownKeys": [ "handlers", "slot", "code", "connection", "state", "latest", "view", "send", "closer", "lastShotKey", "lastStateKey", "opponentWasConnected", "opponentEverHere", "request", "rtt", "rttVar" ], "prototypeLayers": [ { "layer": 0, "constructor": "tR", "methods": [ { "name": "cueOfShooter", "length": 84, "selected": true }, { "name": "tableOfViewer", "length": 55, "selected": true }, { "name": "setSend", "length": 23, "selected": false }, { "name": "setCloser", "length": 27, "selected": false }, { "name": "on", "length": 72, "selected": false }, { "name": "emit", "length": 83, "selected": false }, { "name": "setConnection", "length": 84, "selected": false }, { "name": "ingest", "length": 1132, "selected": true }, { "name": "emitShot", "length": 470, "selected": true }, { "name": "syncArrival", "length": 158, "selected": false }, { "name": "syncPresence", "length": 426, "selected": false }, { "name": "receiveAim", "length": 248, "selected": true }, { "name": "command", "length": 412, "selected": false }, { "name": "shoot", "length": 115, "selected": false }, { "name": "sendAim", "length": 280, "selected": true }, { "name": "noteRoundTrip", "length": 162, "selected": false }, { "name": "placeCue", "length": 58, "selected": true }, { "name": "rematch", "length": 41, "selected": false }, { "name": "declineRematch", "length": 55, "selected": false }, { "name": "ready", "length": 37, "selected": false }, { "name": "claimTurnTimeout", "length": 59, "selected": true }, { "name": "rejoin", "length": 27, "selected": false }, { "name": "leave", "length": 52, "selected": false } ] } ] }, { "path": "player", "constructor": "tI", "ownKeys": [ "tracks", "events", "eventCursor", "time", "duration" ], "prototypeLayers": [ { "layer": 0, "constructor": "tI", "methods": [ { "name": "load", "length": 1057, "selected": true }, { "name": "set", "length": 850, "selected": true }, { "name": "clear", "length": 86, "selected": false }, { "name": "advance", "length": 369, "selected": false }, { "name": "sample", "length": 618, "selected": true } ] } ] }, { "path": "serverState", "constructor": "Object", "ownKeys": [ "matchId", "sequence", "serverTime", "status", "phase", "turn", "players", "balls", "ballInHand", "behindHeadString", "cuePlaced", "winner", "winKind", "rackNumber", "busyForMs", "potted" ], "prototypeLayers": [] }, { "path": "prediction", "constructor": "Object", "ownKeys": [ "cuePath", "ghost", "targetId", "objectPath", "cuePathAfter", "objectDir", "cueDir", "objectPocket", "scratchPocket", "railsBeforeContact", "cutAngle", "objectReach", "cueReach" ], "prototypeLayers": [] }, { "path": "engine.bih", "constructor": "Object", "ownKeys": [ "x", "y", "legal", "restricted" ], "prototypeLayers": [] }, { "path": "engine.snapshot", "constructor": "Object", "ownKeys": [ "version", "phase", "connection", "status", "slot", "code", "turn", "players", "groups", "remaining", "onEight", "stats", "openTable", "ballInHand", "behindHeadString", "canReposition", "rackNumber", "guideLevel", "sound", "message", "messageKind", "messageId", "interactive", "lastPotted", "track", "winner", "winKind", "opponentAway", "opponentGone" ], "prototypeLayers": [] }, { "path": "engine.listeners", "constructor": "Set", "ownKeys": [], "prototypeLayers": [ { "layer": 0, "constructor": "Set", "methods": [ { "name": "has", "length": 32, "selected": false }, { "name": "add", "length": 32, "selected": false }, { "name": "delete", "length": 35, "selected": false }, { "name": "difference", "length": 39, "selected": false }, { "name": "clear", "length": 34, "selected": false }, { "name": "entries", "length": 36, "selected": false }, { "name": "forEach", "length": 36, "selected": false }, { "name": "intersection", "length": 41, "selected": false }, { "name": "isSubsetOf", "length": 39, "selected": false }, { "name": "isSupersetOf", "length": 41, "selected": false }, { "name": "isDisjointFrom", "length": 43, "selected": false }, { "name": "symmetricDifference", "length": 48, "selected": false }, { "name": "union", "length": 34, "selected": false }, { "name": "values", "length": 35, "selected": false }, { "name": "keys", "length": 35, "selected": false } ] } ] }, { "path": "engine.dragStart", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[0]", "constructor": "Object", "ownKeys": [ "id", "group", "p", "v", "w", "orient", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "view.balls[1]", "constructor": "Object", "ownKeys": [ "id", "group", "p", "v", "w", "orient", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "view.balls[2]", "constructor": "Object", "ownKeys": [ "id", "group", "p", "v", "w", "orient", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "view.balls[3]", "constructor": "Object", "ownKeys": [ "id", "group", "p", "v", "w", "orient", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "view.balls[4]", "constructor": "Object", "ownKeys": [ "id", "group", "p", "v", "w", "orient", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "view.balls[5]", "constructor": "Object", "ownKeys": [ "id", "group", "p", "v", "w", "orient", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "view.balls[6]", "constructor": "Object", "ownKeys": [ "id", "group", "p", "v", "w", "orient", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "view.balls[7]", "constructor": "Object", "ownKeys": [ "id", "group", "p", "v", "w", "orient", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "view.balls[8]", "constructor": "Object", "ownKeys": [ "id", "group", "p", "v", "w", "orient", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "view.balls[9]", "constructor": "Object", "ownKeys": [ "id", "group", "p", "v", "w", "orient", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "view.balls[10]", "constructor": "Object", "ownKeys": [ "id", "group", "p", "v", "w", "orient", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "view.balls[11]", "constructor": "Object", "ownKeys": [ "id", "group", "p", "v", "w", "orient", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "view.balls[12]", "constructor": "Object", "ownKeys": [ "id", "group", "p", "v", "w", "orient", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "view.balls[13]", "constructor": "Object", "ownKeys": [ "id", "group", "p", "v", "w", "orient", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "view.balls[14]", "constructor": "Object", "ownKeys": [ "id", "group", "p", "v", "w", "orient", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "view.balls[15]", "constructor": "Object", "ownKeys": [ "id", "group", "p", "v", "w", "orient", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "renderer.effects", "constructor": "tl", "ownKeys": [ "particles", "rings", "pCursor", "rCursor", "pocketGlow" ], "prototypeLayers": [ { "layer": 0, "constructor": "tl", "methods": [ { "name": "clear", "length": 108, "selected": true }, { "name": "particle", "length": 89, "selected": false }, { "name": "ring", "length": 80, "selected": false }, { "name": "emit", "length": 1614, "selected": true }, { "name": "update", "length": 342, "selected": true }, { "name": "glowFor", "length": 44, "selected": true }, { "name": "drawUnderBalls", "length": 347, "selected": true }, { "name": "draw", "length": 495, "selected": true } ] } ] }, { "path": "renderer.ctx", "constructor": "CanvasRenderingContext2D", "ownKeys": [], "prototypeLayers": [ { "layer": 0, "constructor": "CanvasRenderingContext2D", "methods": [ { "name": "clip", "length": 33, "selected": false }, { "name": "createConicGradient", "length": 48, "selected": false }, { "name": "createImageData", "length": 44, "selected": false }, { "name": "createLinearGradient", "length": 49, "selected": false }, { "name": "createPattern", "length": 42, "selected": false }, { "name": "createRadialGradient", "length": 49, "selected": false }, { "name": "drawFocusIfNeeded", "length": 46, "selected": true }, { "name": "drawImage", "length": 38, "selected": true }, { "name": "fill", "length": 33, "selected": false }, { "name": "fillText", "length": 37, "selected": false }, { "name": "getContextAttributes", "length": 49, "selected": false }, { "name": "getImageData", "length": 41, "selected": false }, { "name": "getLineDash", "length": 40, "selected": false }, { "name": "getTransform", "length": 41, "selected": false }, { "name": "isContextLost", "length": 42, "selected": false }, { "name": "isPointInPath", "length": 42, "selected": true }, { "name": "isPointInStroke", "length": 44, "selected": true }, { "name": "measureText", "length": 40, "selected": false }, { "name": "reset", "length": 34, "selected": false }, { "name": "roundRect", "length": 38, "selected": false }, { "name": "setLineDash", "length": 40, "selected": false }, { "name": "strokeText", "length": 39, "selected": true }, { "name": "arc", "length": 32, "selected": false }, { "name": "arcTo", "length": 34, "selected": false }, { "name": "beginPath", "length": 38, "selected": true }, { "name": "bezierCurveTo", "length": 42, "selected": false }, { "name": "clearRect", "length": 38, "selected": false }, { "name": "closePath", "length": 38, "selected": true }, { "name": "ellipse", "length": 36, "selected": false }, { "name": "fillRect", "length": 37, "selected": false }, { "name": "lineTo", "length": 35, "selected": false }, { "name": "moveTo", "length": 35, "selected": true }, { "name": "putImageData", "length": 41, "selected": false }, { "name": "quadraticCurveTo", "length": 45, "selected": false }, { "name": "rect", "length": 33, "selected": false }, { "name": "resetTransform", "length": 43, "selected": false }, { "name": "restore", "length": 36, "selected": false }, { "name": "rotate", "length": 35, "selected": true }, { "name": "save", "length": 33, "selected": false }, { "name": "scale", "length": 34, "selected": false }, { "name": "setTransform", "length": 41, "selected": false }, { "name": "stroke", "length": 35, "selected": true }, { "name": "strokeRect", "length": 39, "selected": true }, { "name": "transform", "length": 38, "selected": false }, { "name": "translate", "length": 38, "selected": false } ] } ] }, { "path": "renderer.sprite", "constructor": "Object", "ownKeys": [ "canvas", "x", "y", "w", "h" ], "prototypeLayers": [] }, { "path": "net.handlers", "constructor": "Object", "ownKeys": [ "session", "connection", "state", "started", "physics", "finished", "opponentJoined", "opponentLeft", "opponentBack", "opponentAim", "gameStarted", "error" ], "prototypeLayers": [] }, { "path": "net.view", "constructor": "Object", "ownKeys": [ "status", "matchId", "hosted", "sequence", "phase", "turn", "players", "balls", "potted", "ballInHand", "behindHeadString", "cuePlaced", "winner", "winKind", "tournament", "rackNumber", "busyForMs", "turnRemainingMs", "turnTotalMs", "warmupRemainingMs", "arrived", "lastShot", "rematch", "you", "table", "wallet", "developer" ], "prototypeLayers": [] }, { "path": "serverState.players[0]", "constructor": "Object", "ownKeys": [ "slot", "name", "avatar", "connected", "ready", "group", "onEight", "remaining", "stats" ], "prototypeLayers": [] }, { "path": "serverState.players[1]", "constructor": "Object", "ownKeys": [ "slot", "name", "avatar", "connected", "ready", "group", "onEight", "remaining", "stats" ], "prototypeLayers": [] }, { "path": "serverState.balls[0]", "constructor": "Object", "ownKeys": [ "id", "x", "y", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "serverState.balls[1]", "constructor": "Object", "ownKeys": [ "id", "x", "y", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "serverState.balls[2]", "constructor": "Object", "ownKeys": [ "id", "x", "y", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "serverState.balls[3]", "constructor": "Object", "ownKeys": [ "id", "x", "y", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "serverState.balls[4]", "constructor": "Object", "ownKeys": [ "id", "x", "y", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "serverState.balls[5]", "constructor": "Object", "ownKeys": [ "id", "x", "y", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "serverState.balls[6]", "constructor": "Object", "ownKeys": [ "id", "x", "y", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "serverState.balls[7]", "constructor": "Object", "ownKeys": [ "id", "x", "y", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "serverState.balls[8]", "constructor": "Object", "ownKeys": [ "id", "x", "y", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "serverState.balls[9]", "constructor": "Object", "ownKeys": [ "id", "x", "y", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "serverState.balls[10]", "constructor": "Object", "ownKeys": [ "id", "x", "y", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "serverState.balls[11]", "constructor": "Object", "ownKeys": [ "id", "x", "y", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "serverState.balls[12]", "constructor": "Object", "ownKeys": [ "id", "x", "y", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "serverState.balls[13]", "constructor": "Object", "ownKeys": [ "id", "x", "y", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "serverState.balls[14]", "constructor": "Object", "ownKeys": [ "id", "x", "y", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "serverState.balls[15]", "constructor": "Object", "ownKeys": [ "id", "x", "y", "inPlay", "pocket" ], "prototypeLayers": [] }, { "path": "prediction.cuePath[0]", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "prediction.cuePath[1]", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "prediction.objectDir", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "prediction.cueDir", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "engine.snapshot.players[0]", "constructor": "Object", "ownKeys": [ "name", "avatar", "kind", "connected", "ready" ], "prototypeLayers": [] }, { "path": "engine.snapshot.players[1]", "constructor": "Object", "ownKeys": [ "name", "avatar", "kind", "connected", "ready" ], "prototypeLayers": [] }, { "path": "engine.snapshot.remaining[0]", "constructor": "Array", "ownKeys": [], "prototypeLayers": [ { "layer": 0, "constructor": "Array", "methods": [ { "name": "at", "length": 31, "selected": false }, { "name": "concat", "length": 35, "selected": false }, { "name": "copyWithin", "length": 39, "selected": false }, { "name": "fill", "length": 33, "selected": false }, { "name": "find", "length": 33, "selected": false }, { "name": "findIndex", "length": 38, "selected": false }, { "name": "findLast", "length": 37, "selected": false }, { "name": "findLastIndex", "length": 42, "selected": false }, { "name": "lastIndexOf", "length": 40, "selected": false }, { "name": "pop", "length": 32, "selected": false }, { "name": "push", "length": 33, "selected": false }, { "name": "reverse", "length": 36, "selected": false }, { "name": "shift", "length": 34, "selected": false }, { "name": "unshift", "length": 36, "selected": false }, { "name": "slice", "length": 34, "selected": false }, { "name": "sort", "length": 33, "selected": false }, { "name": "splice", "length": 35, "selected": false }, { "name": "includes", "length": 37, "selected": false }, { "name": "indexOf", "length": 36, "selected": false }, { "name": "join", "length": 33, "selected": false }, { "name": "keys", "length": 33, "selected": false }, { "name": "entries", "length": 36, "selected": false }, { "name": "values", "length": 35, "selected": false }, { "name": "forEach", "length": 36, "selected": false }, { "name": "filter", "length": 35, "selected": false }, { "name": "flat", "length": 33, "selected": false }, { "name": "flatMap", "length": 36, "selected": false }, { "name": "map", "length": 32, "selected": false }, { "name": "every", "length": 34, "selected": false }, { "name": "some", "length": 33, "selected": false }, { "name": "reduce", "length": 35, "selected": false }, { "name": "reduceRight", "length": 40, "selected": false }, { "name": "toReversed", "length": 39, "selected": false }, { "name": "toSorted", "length": 37, "selected": false }, { "name": "toSpliced", "length": 38, "selected": false }, { "name": "with", "length": 33, "selected": false }, { "name": "toLocaleString", "length": 43, "selected": false }, { "name": "toString", "length": 37, "selected": false } ] } ] }, { "path": "engine.snapshot.remaining[1]", "constructor": "Array", "ownKeys": [], "prototypeLayers": [ { "layer": 0, "constructor": "Array", "methods": [ { "name": "at", "length": 31, "selected": false }, { "name": "concat", "length": 35, "selected": false }, { "name": "copyWithin", "length": 39, "selected": false }, { "name": "fill", "length": 33, "selected": false }, { "name": "find", "length": 33, "selected": false }, { "name": "findIndex", "length": 38, "selected": false }, { "name": "findLast", "length": 37, "selected": false }, { "name": "findLastIndex", "length": 42, "selected": false }, { "name": "lastIndexOf", "length": 40, "selected": false }, { "name": "pop", "length": 32, "selected": false }, { "name": "push", "length": 33, "selected": false }, { "name": "reverse", "length": 36, "selected": false }, { "name": "shift", "length": 34, "selected": false }, { "name": "unshift", "length": 36, "selected": false }, { "name": "slice", "length": 34, "selected": false }, { "name": "sort", "length": 33, "selected": false }, { "name": "splice", "length": 35, "selected": false }, { "name": "includes", "length": 37, "selected": false }, { "name": "indexOf", "length": 36, "selected": false }, { "name": "join", "length": 33, "selected": false }, { "name": "keys", "length": 33, "selected": false }, { "name": "entries", "length": 36, "selected": false }, { "name": "values", "length": 35, "selected": false }, { "name": "forEach", "length": 36, "selected": false }, { "name": "filter", "length": 35, "selected": false }, { "name": "flat", "length": 33, "selected": false }, { "name": "flatMap", "length": 36, "selected": false }, { "name": "map", "length": 32, "selected": false }, { "name": "every", "length": 34, "selected": false }, { "name": "some", "length": 33, "selected": false }, { "name": "reduce", "length": 35, "selected": false }, { "name": "reduceRight", "length": 40, "selected": false }, { "name": "toReversed", "length": 39, "selected": false }, { "name": "toSorted", "length": 37, "selected": false }, { "name": "toSpliced", "length": 38, "selected": false }, { "name": "with", "length": 33, "selected": false }, { "name": "toLocaleString", "length": 43, "selected": false }, { "name": "toString", "length": 37, "selected": false } ] } ] }, { "path": "engine.snapshot.stats[0]", "constructor": "Object", "ownKeys": [ "shots", "potted", "fouls", "bestRun" ], "prototypeLayers": [] }, { "path": "engine.snapshot.stats[1]", "constructor": "Object", "ownKeys": [ "shots", "potted", "fouls", "bestRun" ], "prototypeLayers": [] }, { "path": "view.balls[0].p", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[0].v", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[0].w", "constructor": "Object", "ownKeys": [ "x", "y", "z" ], "prototypeLayers": [] }, { "path": "view.balls[1].p", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[1].v", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[1].w", "constructor": "Object", "ownKeys": [ "x", "y", "z" ], "prototypeLayers": [] }, { "path": "view.balls[2].p", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[2].v", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[2].w", "constructor": "Object", "ownKeys": [ "x", "y", "z" ], "prototypeLayers": [] }, { "path": "view.balls[3].p", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[3].v", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[3].w", "constructor": "Object", "ownKeys": [ "x", "y", "z" ], "prototypeLayers": [] }, { "path": "view.balls[4].p", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[4].v", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[4].w", "constructor": "Object", "ownKeys": [ "x", "y", "z" ], "prototypeLayers": [] }, { "path": "view.balls[5].p", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[5].v", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[5].w", "constructor": "Object", "ownKeys": [ "x", "y", "z" ], "prototypeLayers": [] }, { "path": "view.balls[6].p", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[6].v", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[6].w", "constructor": "Object", "ownKeys": [ "x", "y", "z" ], "prototypeLayers": [] }, { "path": "view.balls[7].p", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[7].v", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[7].w", "constructor": "Object", "ownKeys": [ "x", "y", "z" ], "prototypeLayers": [] }, { "path": "view.balls[8].p", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[8].v", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[8].w", "constructor": "Object", "ownKeys": [ "x", "y", "z" ], "prototypeLayers": [] }, { "path": "view.balls[9].p", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[9].v", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[9].w", "constructor": "Object", "ownKeys": [ "x", "y", "z" ], "prototypeLayers": [] }, { "path": "view.balls[10].p", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[10].v", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[10].w", "constructor": "Object", "ownKeys": [ "x", "y", "z" ], "prototypeLayers": [] }, { "path": "view.balls[11].p", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[11].v", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[11].w", "constructor": "Object", "ownKeys": [ "x", "y", "z" ], "prototypeLayers": [] }, { "path": "view.balls[12].p", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[12].v", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[12].w", "constructor": "Object", "ownKeys": [ "x", "y", "z" ], "prototypeLayers": [] }, { "path": "view.balls[13].p", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[13].v", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[13].w", "constructor": "Object", "ownKeys": [ "x", "y", "z" ], "prototypeLayers": [] }, { "path": "view.balls[14].p", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[14].v", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[14].w", "constructor": "Object", "ownKeys": [ "x", "y", "z" ], "prototypeLayers": [] }, { "path": "view.balls[15].p", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[15].v", "constructor": "Object", "ownKeys": [ "x", "y" ], "prototypeLayers": [] }, { "path": "view.balls[15].w", "constructor": "Object", "ownKeys": [ "x", "y", "z" ], "prototypeLayers": [] }, { "path": "renderer.effects.particles[0]", "constructor": "Object", "ownKeys": [ "active", "x", "y", "vx", "vy", "life", "maxLife", "size", "drag", "r", "g", "b" ], "prototypeLayers": [] }, { "path": "renderer.effects.particles[1]", "constructor": "Object", "ownKeys": [ "active", "x", "y", "vx", "vy", "life", "maxLife", "size", "drag", "r", "g", "b" ], "prototypeLayers": [] } ], "methodSources": [ { "path": "engine", "prototype": "tD", "name": "buildSnapshot", "source": "buildSnapshot(){let e=this.state,t=this.mine,a=+(0===t),i=(t,a)=>{let i=e?.players[t];return{name:i?.name||(\"you\"===a?\"You\":\"Opponent\"),avatar:i?.avatar??null,kind:a,connected:i?.connected??!1,ready:i?.ready??!1}},n=t=>e?.players[t]?.stats??tG;return{version:this.version,phase:this.phase,connection:this.net.connection,status:e?.status??\"waiting\",slot:this.net.slot,code:this.net.code,turn:e?this.rel(e.turn)??0:0,players:[i(t,\"you\"),i(a,\"them\")],groups:[e?.players[t].group??null,e?.players[a].group??null],remaining:[e?.players[t].remaining??[],e?.players[a].remaining??[]],onEight:[e?.players[t].onEight??!1,e?.players[a].onEight??!1],stats:[n(t),n(a)],openTable:!e||\"open\"===e.phase||\"break\"===e.phase,ballInHand:e?.ballInHand??!1,behindHeadString:e?.behindHeadString??!1,canReposition:this.canReposition(),rackNumber:e?.rackNumber??1,guideLevel:this.guideLevel,sound:this.soundOn,message:this.message,messageKind:this.messageKind,messageId:this.messageId,interactive:\"aiming\"===this.phase||\"ballInHand\"===this.phase||\"charging\"===this.phase,lastPotted:this.lastPotted,track:this.track,winner:this.rel(e?.winner??null),winKind:e?.winKind??null,opponentAway:this.opponentAway,opponentGone:this.opponentGone}}" }, { "path": "engine", "prototype": "tD", "name": "readLive", "source": "readLive(){return{power:this.power,spinX:this.spinX,spinY:this.spinY,pullback:this.pullback,angle:this.aimAngle,blockedTarget:this.blockedTarget(),turning:this.turnHold}}" }, { "path": "engine", "prototype": "tD", "name": "attachNetwork", "source": "attachNetwork(){let e=this.net;this.unsubscribe.push(e.on(\"connection\",()=>this.publish()),e.on(\"state\",e=>this.applyState(e)),e.on(\"gameStarted\",()=>{eK.rack(),this.setMessage(\"Break!\",\"info\")}),e.on(\"started\",e=>{e.by===this.net.slot&&this.awaitingOwnShot()||(this.pendingShot=null,this.shotUnsureAt=null,this.remote=null,this.remoteSettled=!1,this.remoteShot=e.shot,this.aimAngle=e.shot.angle,this.spinX=e.shot.spinX,this.spinY=e.shot.spinY,this.power=e.shot.power,this.view.cueBall.p.x=e.cue.x,this.view.cueBall.p.y=e.cue.y,this.view.cueBall.inPlay=!0,this.prediction=null,this.cueAlpha=1,this.phase=\"shooting\",this.shootStart=this.now,this.beginSet(0),this.bih=null,this.publish())}),e.on(\"physics\",(e,t)=>{null!==this.shotSentAt&&0===t&&null===this.shotUnsureAt&&this.noteShotAnswer(performance.now()-this.shotSentAt),this.shotSentAt=null,this.pendingReplay={replay:e.replay,elapsedMs:t},t>0&&this.beginPlayback()}),e.on(\"finished\",e=>{this.pendingOutcome=e.outcome,this.pendingState=e.state,this.lastPotted=e.outcome.pocketed}),e.on(\"opponentJoined\",e=>{this.opponentAway=!1,this.setMessage(`${e.name} joined`,\"info\")}),e.on(\"opponentLeft\",e=>{this.opponentAway=!0,this.opponentGone=e.permanent,this.setMessage(e.permanent?\"Your opponent left the match\":\"Opponent disconnected — waiting\",\"foul\")}),e.on(\"opponentBack\",()=>{this.opponentAway=!1,this.opponentGone=!1,this.setMessage(\"Opponent reconnected\",\"good\")}),e.on(\"opponentAim\",e=>{\"waiting\"===this.phase&&(this.remote=e)}),e.on(\"error\",e=>this.setMessage(e,\"foul\")))}" }, { "path": "engine", "prototype": "tD", "name": "applyState", "source": "applyState(e){let t=\"playing\"===this.phase||\"shooting\"===this.phase||\"sending\"===this.phase,a=this.awaitingOwnShot()&&!this.pendingReplay&&null!==this.state&&e.sequence>this.state.sequence;if(t&&!a){this.pendingState=e;return}a&&(this.forgetShot(),this.centreSpin()),this.state=e,this.view.apply(e.balls),this.track=tW(e),this.predictionDirty=!0,this.enterTurn()}" }, { "path": "engine", "prototype": "tD", "name": "enterTurn", "source": "enterTurn(){this.practice=null;let e=this.state;if(!e){this.phase=\"idle\",this.publish();return}if(\"finished\"===e.status||\"gameOver\"===e.phase){this.phase=\"gameOver\",this.bih=null,this.publish();return}if(\"playing\"!==e.status||null===this.net.slot){this.phase=\"waiting\",this.bih=null,this.publish();return}if(e.turn!==this.net.slot){this.phase=\"waiting\",this.bih=null,this.prediction=null,this.publish();return}if(this.power=this.myPower,this.pullback=0,this.wheelUsed=!1,e.ballInHand&&!e.cuePlaced){let t=this.view.cueBall;this.bih={x:t.inPlay?t.p.x:b,y:t.inPlay?t.p.y:0,legal:!0,restricted:e.behindHeadString},this.bih.legal=this.placementLegal(this.bih.x,this.bih.y),this.phase=\"ballInHand\"}else this.bih=null,this.phase=\"aiming\",this.faceNearestTarget();this.cueAlpha=1,this.predictionDirty=!0,this.remote=null,this.remoteSettled=!1,this.resetAimCache(),this.publish()}" }, { "path": "engine", "prototype": "tD", "name": "canReposition", "source": "canReposition(){let e=this.state;return!!e&&null!==this.net.slot&&e.turn===this.net.slot&&!!e.ballInHand&&(\"aiming\"===this.phase||\"charging\"===this.phase||\"ballInHand\"===this.phase)}" }, { "path": "engine", "prototype": "tD", "name": "faceNearestTarget", "source": "faceNearestTarget(){let e=this.state;if(!e||null===this.net.slot)return;let t=this.view.cueBall,a=-1,i=1/0;for(let n of tX(e,this.net.slot)){let e=this.view.balls[n];if(!e.inPlay)continue;let l=Math.hypot(e.p.x-t.p.x,e.p.y-t.p.y);l<i&&(i=l,a=n)}if(a>=0){let e=this.view.balls[a];this.aimAngle=Math.atan2(e.p.y-t.p.y,e.p.x-t.p.x)}}" }, { "path": "engine", "prototype": "tD", "name": "resize", "source": "resize(e,t,a){this.renderer.resize(e,t,a),this.predictionDirty=!0}" }, { "path": "engine", "prototype": "tD", "name": "setGuideLevel", "source": "setGuideLevel(e){this.guideLevel=e,\"extended\"!==e&&(this.practice=null),this.predictionDirty=!0,this.publish()}" }, { "path": "engine", "prototype": "tD", "name": "setPractice", "source": "setPractice(e){if(\"extended\"!==this.guideLevel)return;let t=e?.cuePath?.[0],a=this.view.cueBall.p;e&&(!t||Math.hypot(t.x-a.x,t.y-a.y)>1e-6)||(this.practice=e,this.predictionDirty=!0)}" }, { "path": "engine", "prototype": "tD", "name": "frame", "source": "frame(e){let t=Math.min(.05,(e-this.lastTime)/1e3),a=Math.min(50,e-this.lastTime);this.lastTime=e,this.now=e,this.update(t,a),this.broadcastAim(),this.view.spin(t);let i=\"waiting\"===this.phase&&null!==this.remote;this.renderer.render({world:this.view,time:e/1e3,angle:i?this.viewAngle:this.aimAngle,power:i?this.viewPower:this.power,spinX:i?this.viewSpinX:this.spinX,spinY:i?this.viewSpinY:this.spinY,prediction:i?this.watchPrediction:this.prediction,guideLevel:i?this.watchLevel():this.guideLevel,showAim:this.showAim()||i&&null!==this.watchPrediction,showCue:this.showCue(),pullback:i?this.viewPullback:this.pullback,cueAlpha:this.cueAlpha,ballInHand:this.bih,legalTargets:this.highlightTargets(),blockedTarget:this.blockedTarget(),foulFlash:this.foulFlash,aiThinking:!1,cue:this.net.cueOfShooter(),table:this.net.tableOfViewer()})}" }, { "path": "engine", "prototype": "tD", "name": "showAim", "source": "showAim(){return\"aiming\"===this.phase||\"charging\"===this.phase}" }, { "path": "engine", "prototype": "tD", "name": "showCue", "source": "showCue(){return\"place\"!==this.dragMode&&null===this.bih&&(\"aiming\"===this.phase||\"charging\"===this.phase||\"shooting\"===this.phase||\"sending\"===this.phase||\"waiting\"===this.phase&&null!==this.remote)}" }, { "path": "engine", "prototype": "tD", "name": "blockedTarget", "source": "blockedTarget(){if(\"aiming\"!==this.phase&&\"charging\"!==this.phase)return -1;let e=this.state;if(!e||null===this.net.slot)return -1;let t=this.prediction?.targetId??-1;return t<0||\"break\"===e.phase||tX(e,this.net.slot).includes(t)?-1:t}" }, { "path": "engine", "prototype": "tD", "name": "update", "source": "update(e,t){switch(this.foulFlash=Math.max(0,this.foulFlash-1.6*e),this.phase){case\"waiting\":this.followOpponent(e);break;case\"aiming\":case\"ballInHand\":{this.cueAlpha=Math.min(1,this.cueAlpha+6*e);let t=this.powerHeld||this.now<this.wheelShowUntil,a=t&&\"aiming\"===this.phase?this.power:0;if(this.pullback+=(a-this.pullback)*Math.min(1,e*(t?22:14)),0!==this.turnHold&&\"aiming\"===this.phase){let t=(performance.now()-this.turnHoldAt)/1e3;if(1e3*t>=260){let a=Math.min(1,(t-.26)/1.5);this.nudgeAim(this.turnHold*(.07+.13*a*a)*e*(this.fineAim?.1:1))}}if(this.spaceDown){let e=(this.now-this.spaceStart)/900;this.power=eL(.1+(e%2<1?e%1:1-e%1)*.95,.05,1),this.pullback=this.power,this.predictionDirty=!0}this.refreshPrediction();break}case\"charging\":this.pullback+=(this.power-this.pullback)*Math.min(1,22*e),this.refreshPrediction();break;case\"shooting\":{if(null===this.strokeAt){let e=this.now-this.shootStart,t=eL(e/220,0,1);if(this.pullback=this.power*(1+.06*(1-(1-t)*(1-t))),!this.pendingReplay&&e<this.setFor)break;this.strokeAt=this.now,this.strokeFrom=this.pullback}let e=eL((this.now-this.strokeAt)/this.strokeMs,0,1);this.pullback=this.strokeFrom*(1-e*e),e>=1&&(this.pullback=0,eK.cueStrike(this.power),this.pendingReplay?this.beginPlayback():this.phase=\"sending\");break}case\"sending\":this.pendingReplay?this.beginPlayback():null!==this.shotUnsureAt&&this.now-this.shotUnsureAt>=12e3&&this.abandonShot();break;case\"playing\":for(let a of(this.cueAlpha=Math.max(0,this.cueAlpha-8*e),this.player.advance(t,this.view)))this.consumeEvent(a);this.player.finished&&this.finishPlayback();break;case\"resolving\":this.now>=this.resolveAt&&this.finishResolve()}}" }, { "path": "engine", "prototype": "tD", "name": "followOpponent", "source": "followOpponent(e){let t=this.remote;if(t){if(this.remoteSettled){let a=Math.min(1,18*e);this.viewAngle+=eB(this.viewAngle,t.angle)*a,this.viewPower+=(t.power-this.viewPower)*a,this.viewPullback+=((t.charging?t.power:0)-this.viewPullback)*Math.min(1,22*e)}else this.remoteSettled=!0,this.viewAngle=t.angle,this.viewPower=t.power,this.viewPullback=t.charging?t.power:0;if(this.viewSpinX=t.spinX,this.viewSpinY=t.spinY,this.cueAlpha=Math.min(1,this.cueAlpha+6*e),this.refreshWatchGuide(t),t.cue){let e=this.view.cueBall;e.p.x=t.cue.x,e.p.y=t.cue.y,e.inPlay=!0,this.bih={x:t.cue.x,y:t.cue.y,legal:!0,restricted:this.state?.behindHeadString??!1}}else this.bih&&(this.bih=null)}}" }, { "path": "engine", "prototype": "tD", "name": "refreshWatchGuide", "source": "refreshWatchGuide(e){if(e.cue||!this.view.cueBall.inPlay){this.watchPrediction=null,this.watchKey=\"\";return}let t=this.view.cueBall.p,a=`${this.viewAngle.toFixed(4)}:${t.x}:${t.y}:${this.watchLevel()}`;a!==this.watchKey&&(this.watchKey=a,this.watchPrediction=eQ(this.view,this.viewAngle,this.watchLevel()))}" }, { "path": "engine", "prototype": "tD", "name": "broadcastAim", "source": "broadcastAim(){let e=this.state;if(!e||null===this.net.slot||e.turn!==this.net.slot||\"aiming\"!==this.phase&&\"charging\"!==this.phase&&\"ballInHand\"!==this.phase||this.now-this.aimSentAt<50)return;let t=\"place\"===this.dragMode&&this.bih?this.bih:null,a=\"charging\"===this.phase,i=t?t.x:0/0,n=t?t.y:0/0;t$(this.sentAngle,this.aimAngle,.002)&&t$(this.sentPower,this.power,.01)&&t$(this.sentSpinX,this.spinX,.01)&&t$(this.sentSpinY,this.spinY,.01)&&t$(this.sentCueX,i,8e-4)&&t$(this.sentCueY,n,8e-4)&&this.sentCharging===a||(this.aimSentAt=this.now,this.sentAngle=this.aimAngle,this.sentPower=this.power,this.sentSpinX=this.spinX,this.sentSpinY=this.spinY,this.sentCueX=i,this.sentCueY=n,this.sentCharging=a,this.net.sendAim({angle:this.aimAngle,power:this.power,spinX:this.spinX,spinY:this.spinY,cue:t?{x:t.x,y:t.y}:null,charging:a}))}" }, { "path": "engine", "prototype": "tD", "name": "resetAimCache", "source": "resetAimCache(){this.sentAngle=0/0,this.sentPower=0/0,this.sentSpinX=0/0,this.sentSpinY=0/0,this.sentCueX=0/0,this.sentCueY=0/0,this.sentCharging=!1}" }, { "path": "engine", "prototype": "tD", "name": "refreshPrediction", "source": "refreshPrediction(){if(this.predictionDirty){if(this.predictionDirty=!1,!this.view.cueBall.inPlay){this.prediction=null;return}this.prediction=\"extended\"===this.guideLevel&&this.practice?this.practice:eQ(this.view,this.aimAngle,this.guideLevel)}}" }, { "path": "engine", "prototype": "tD", "name": "beginSet", "source": "beginSet(e){this.strokeAt=null,this.strokeMs=tE(this.power),this.setFor=e}" }, { "path": "engine", "prototype": "tD", "name": "noteShotAnswer", "source": "noteShotAnswer(e){let t=this.net.roundTripMs;t<=0||!(e>0)||e>1e4||(this.shotExtra+=(eL(e-t,0,450)-this.shotExtra)/2)}" }, { "path": "engine", "prototype": "tD", "name": "awaitingOwnShot", "source": "awaitingOwnShot(){return null!==this.pendingShot&&(\"shooting\"===this.phase||\"sending\"===this.phase)}" }, { "path": "engine", "prototype": "tD", "name": "centreSpin", "source": "centreSpin(){this.spinX=0,this.spinY=0}" }, { "path": "engine", "prototype": "tD", "name": "forgetShot", "source": "forgetShot(){this.pendingShot=null,this.shotUnsureAt=null,this.shotSentAt=null}" }, { "path": "engine", "prototype": "tD", "name": "abandonShot", "source": "abandonShot(){this.forgetShot(),this.centreSpin();let e=this.net.latest;e&&this.state&&e.sequence>this.state.sequence?(this.pendingState=null,this.state=e,this.view.apply(e.balls),this.track=tW(e),this.predictionDirty=!0):this.setMessage(\"No answer from the table. If your shot does not play, take it again.\",\"foul\"),this.enterTurn()}" }, { "path": "engine", "prototype": "tD", "name": "beginPlayback", "source": "beginPlayback(){let e=this.pendingReplay;e&&(this.pendingReplay=null,this.forgetShot(),this.centreSpin(),this.player.load(e.replay,e.elapsedMs),this.prediction=null,this.bih=null,this.remoteShot=null,this.phase=\"playing\",this.publish())}" }, { "path": "engine", "prototype": "tD", "name": "consumeEvent", "source": "consumeEvent(e){switch(this.renderer.effects.emit(e,[]),e.type){case\"ballBall\":e.speed>.06&&eK.ballHit(e.speed);break;case\"cushion\":case\"jaw\":e.speed>.12&&eK.cushion(e.speed);break;case\"pocketWall\":e.speed>.2&&eK.cushion(.6*e.speed);break;case\"pocket\":{eK.pocket();let t=v.find(t=>t.id===e.pocket),a=this.view.balls[e.a];this.renderer.notePot(e.a,e.x,e.y,t?t.hole.x:a.p.x,t?t.hole.y:a.p.y,this.now/1e3),a.inPlay=!1,0===e.a||this.track.includes(e.a)||(this.track=[...this.track,e.a],this.publish())}}}" }, { "path": "engine", "prototype": "tD", "name": "finishPlayback", "source": "finishPlayback(){this.player.clear();let e=this.pendingOutcome;e&&(this.pendingOutcome=null,e.foul?(this.foulFlash=1,eK.foul(),this.setMessage(e.message,\"foul\")):e.message&&this.setMessage(e.message,e.messageKind),e.gameOver&&(e.winner===this.net.slot?eK.win():eK.lose()),e.stalemate&&eK.rack(),this.resolveAt=this.now+(e.foul||e.gameOver?1e3:620),this.phase=\"resolving\",this.publish())}" }, { "path": "engine", "prototype": "tD", "name": "finishResolve", "source": "finishResolve(){let e=this.pendingState;this.pendingState=null,e&&(this.state=e,this.view.apply(e.balls),this.track=tW(e)),this.enterTurn()}" }, { "path": "engine", "prototype": "tD", "name": "setPower", "source": "setPower(e){this.power=eL(e,0,1),this.myPower=this.power,this.predictionDirty=!0,\"aiming\"===this.phase&&(this.pullback=this.power)}" }, { "path": "engine", "prototype": "tD", "name": "holdPower", "source": "holdPower(e){this.powerHeld=e}" }, { "path": "engine", "prototype": "tD", "name": "commitPower", "source": "commitPower(e){this.powerHeld=!1,this.setPower(e),this.shoot()}" }, { "path": "engine", "prototype": "tD", "name": "setSpin", "source": "setSpin(e,t){let a=Math.hypot(e,t);a>1&&(e/=a,t/=a),this.spinX=e,this.spinY=t,this.predictionDirty=!0,this.publish()}" }, { "path": "engine", "prototype": "tD", "name": "nudgeAim", "source": "nudgeAim(e){\"aiming\"===this.phase&&(this.aimAngle+=e,this.predictionDirty=!0)}" }, { "path": "engine", "prototype": "tD", "name": "wheelAim", "source": "wheelAim(e){this.nudgeAim(3e-4*e*tB(this.sensitivity))}" }, { "path": "engine", "prototype": "tD", "name": "holdFineAim", "source": "holdFineAim(e,t,a=!1){if(0===e){this.turnHoldBy===t&&this.releaseFineAim();return}(this.turnHold!==e||this.turnHoldBy!==t)&&this.nudgeAim(.0035*e*(a?.1:1)),this.turnHold=e,this.turnHoldBy=t,this.turnHoldAt=performance.now()}" }, { "path": "engine", "prototype": "tD", "name": "releaseFineAim", "source": "releaseFineAim(){this.turnHold=0,this.turnHoldBy=null}" }, { "path": "engine", "prototype": "tD", "name": "shoot", "source": "shoot(){if(\"aiming\"!==this.phase&&\"charging\"!==this.phase||null===this.state)return;if(this.power<.03){this.phase=\"aiming\";return}let e={angle:this.aimAngle,power:this.power,spinX:this.spinX,spinY:this.spinY};this.myPower=e.power,this.pendingShot=e,this.pendingOutcome=null,this.pendingReplay=null,this.lastPotted=[],this.phase=\"shooting\",this.shootStart=this.now,this.shotSentAt=performance.now(),this.beginSet(this.setLead(tE(e.power))),this.publish();let t=this.state.sequence;this.net.shoot(e,t).then(t=>{if(tq(t)&&this.pendingShot===e&&this.awaitingOwnShot()&&!this.pendingReplay){if(tq(t)&&!0===t.undelivered){this.shotUnsureAt=this.now,this.setMessage(t.message,\"info\");return}this.forgetShot(),this.pendingReplay=null,this.setMessage(t.message,\"foul\"),\"out-of-order\"===t.code||\"internal\"===t.code?this.net.rejoin():this.enterTurn()}})}" }, { "path": "engine", "prototype": "tD", "name": "placeCueBall", "source": "async placeCueBall(e,t){if(!this.bih||!this.state||\"ballInHand\"!==this.phase&&!this.canReposition()||!this.placementLegal(e,t))return!1;let a=await this.net.placeCue(e,t,this.state.sequence);return tq(a)?(this.setMessage(a.message,\"foul\"),this.enterTurn(),!1):(eK.uiTap(),!0)}" }, { "path": "engine", "prototype": "tD", "name": "placementLegal", "source": "placementLegal(e,t){return!(!S(e,t,.028575,this.view.balls.filter(e=>0!==e.id))||this.state?.behindHeadString&&e>b)}" }, { "path": "engine", "prototype": "tD", "name": "overTable", "source": "overTable(e){return Math.abs(e.x)<r+.14&&Math.abs(e.y)<o+.14}" }, { "path": "engine", "prototype": "tD", "name": "overCue", "source": "overCue(e){if(\"aiming\"!==this.phase&&\"charging\"!==this.phase)return!1;let t=this.view.cueBall;if(!t.inPlay)return!1;let a=-Math.cos(this.aimAngle),i=-Math.sin(this.aimAngle),n=e.x-t.p.x,l=e.y-t.p.y,r=n*a+l*i;return!(r<.017145)&&!(r>.58)&&.075>Math.abs(-(n*i)+l*a)}" }, { "path": "engine", "prototype": "tD", "name": "overCueBall", "source": "overCueBall(e){let t=this.view.cueBall;return!!t.inPlay&&.051435>Math.hypot(e.x-t.p.x,e.y-t.p.y)}" }, { "path": "engine", "prototype": "tD", "name": "beginPlacing", "source": "beginPlacing(e,t){this.pointerId=e.pointerId,this.dragMode=\"place\",this.canvasEl.setPointerCapture(e.pointerId),this.updateBallInHand(t),e.preventDefault()}" }, { "path": "engine", "prototype": "tD", "name": "beginStroke", "source": "beginStroke(e,t){this.dragMode=\"cue\",this.dragStart=t,this.phase=\"charging\",this.powerBeforeStroke=this.power,this.strokeMouse=\"mouse\"===e.pointerType,this.strokeBase=this.strokeMouse&&this.wheelUsed?this.power:0,this.strokeTravelPx=0,this.power=this.strokeBase,this.publish(),e.preventDefault()}" }, { "path": "engine", "prototype": "tD", "name": "turnAim", "source": "turnAim(e){let t=this.view.cueBall;if(!t.inPlay)return;let a=e.x-t.p.x,i=e.y-t.p.y;if(.0200025>Math.hypot(a,i))return;let n=Math.atan2(i,a);this.aimAngle+=eB(this.turnLast,n)*tB(this.sensitivity)*(this.fineAim?.12:1),this.turnLast=n,this.predictionDirty=!0}" }, { "path": "engine", "prototype": "tD", "name": "followFinger", "source": "followFinger(e){if(tB(this.sensitivity)>=1)return void this.aimAt(e);let t=this.view.cueBall;if(!t.inPlay)return;let a=e.x-t.p.x,i=e.y-t.p.y;if(.0200025>Math.hypot(a,i))return;let n=Math.atan2(i,a);this.aimAngle+=eB(this.fingerLast,n)*tB(this.sensitivity),this.fingerLast=n,this.predictionDirty=!0}" }, { "path": "engine", "prototype": "tD", "name": "aimAt", "source": "aimAt(e){let t=this.view.cueBall;if(!t.inPlay)return;let a=e.x-t.p.x,i=e.y-t.p.y;if(.0200025>Math.hypot(a,i))return;let n=Math.atan2(i,a);this.fineAim?this.aimAngle+=.12*eB(this.aimAngle,n):this.aimAngle=n,this.predictionDirty=!0}" }, { "path": "engine", "prototype": "tD", "name": "updateBallInHand", "source": "updateBallInHand(e){let t=this.view.balls.filter(e=>0!==e.id),a=function(e,t,a=[]){let i=Math.min(Math.max(e,-r+.028575),r-.028575),n=Math.min(Math.max(t,-o+.028575),o-.028575);for(let e=0;e<12;e++){let e=!1;for(let t of a){if(!t.inPlay)continue;let a=i-t.p.x,l=n-t.p.y,r=Math.hypot(a,l);if(r<.05725){let o=r>1e-6?1/r:0,s=r>1e-6?a*o:1,c=r>1e-6?l*o:0;i=t.p.x+.05725*s,n=t.p.y+.05725*c,e=!0}}for(let t of v){let a=i-t.x,l=n-t.y,r=Math.hypot(a,l),o=t.captureRadius+.0142875;if(r<o){let s=r>1e-6?1/r:0,c=r>1e-6?a*s:-t.dirX,d=r>1e-6?l*s:-t.dirY;i=t.x+c*o,n=t.y+d*o,e=!0}}if(i=Math.min(Math.max(i,-r+.028575),r-.028575),n=Math.min(Math.max(n,-o+.028575),o-.028575),!e)break}if(S(i,n,.028575,a))return{x:i,y:n};for(let i=1;i<=26;i++){let n=.028575*i*.85,l=Math.min(48,6+3*i);for(let r=0;r<l;r++){let o=r/l*Math.PI*2+.7*i,s=e+Math.cos(o)*n,c=t+Math.sin(o)*n;if(S(s,c,.028575,a))return{x:s,y:c}}}return{x:i,y:n}}(e.x,e.y,t),i=this.placementLegal(e.x,e.y);this.bih={x:i?e.x:a.x,y:i?e.y:a.y,legal:this.placementLegal(i?e.x:a.x,i?e.y:a.y),restricted:this.state?.behindHeadString??!1}}" }, { "path": "view", "prototype": "tL", "name": "apply", "source": "apply(e){for(let t of e){let e=this.balls[t.id];e&&(e.p.x=t.x,e.p.y=t.y,e.v.x=0,e.v.y=0,e.w.x=0,e.w.y=0,e.w.z=0,e.inPlay=t.inPlay,e.pocket=t.pocket)}}" }, { "path": "view", "prototype": "tL", "name": "spin", "source": "spin(e){if(!(e<=0))for(let t of(this.orthoCounter++,this.balls)){if(!t.inPlay)continue;let{x:a,y:i,z:n}=t.w;(0!==a||0!==i||0!==n)&&(!function(e,t,a,i,n){let l=Math.hypot(t,a,i)*n;if(l<1e-9)return;let r=1/(l/n),o=t*r,s=a*r,c=i*r,d=Math.cos(l),h=Math.sin(l),u=1-d,f=u*o*o+d,g=u*o*s-h*c,b=u*o*c+h*s,p=u*o*s+h*c,m=u*s*s+d,w=u*s*c-h*o,y=u*o*c-h*s,x=u*s*c+h*o,k=u*c*c+d,v=e[0],M=e[1],S=e[2],P=e[3],j=e[4],T=e[5],C=e[6],A=e[7],N=e[8];e[0]=f*v+g*P+b*C,e[1]=f*M+g*j+b*A,e[2]=f*S+g*T+b*N,e[3]=p*v+m*P+w*C,e[4]=p*M+m*j+w*A,e[5]=p*S+m*T+w*N,e[6]=y*v+x*P+k*C,e[7]=y*M+x*j+k*A,e[8]=y*S+x*T+k*N}(t.orient,a,i,n,e),(this.orthoCounter+t.id)%60==0&&function(e){let t=e[0],a=e[1],i=e[2],n=Math.hypot(t,a,i)||1;t/=n,a/=n,i/=n;let l=e[3],r=e[4],o=e[5],s=t*l+a*r+i*o;l-=s*t,r-=s*a,o-=s*i,n=Math.hypot(l,r,o)||1,l/=n,r/=n,o/=n,e[0]=t,e[1]=a,e[2]=i,e[3]=l,e[4]=r,e[5]=o,e[6]=a*o-i*r,e[7]=i*l-t*o,e[8]=t*r-a*l}(t.orient))}}" }, { "path": "renderer", "prototype": "tM", "name": "ballSkin", "source": "ballSkin(){return{skin:this.theme?.balls??null,mark:this.theme?.mark??null,pxPerMetre:this.scale*this.dpr}}" }, { "path": "renderer", "prototype": "tM", "name": "render", "source": "render(e){let t=this.ctx,a=e.time,i=this.lastFrame?Math.min(.05,a-this.lastFrame):0;for(let n of(this.lastFrame=a,this.effects.update(i),this.drops=this.drops.filter(e=>a-e.t0<.44),this.syncTheme(e.table),t.setTransform(this.dpr,0,0,this.dpr,0,0),t.clearRect(0,0,this.cssW,this.cssH),t.save(),t.translate(this.originX,this.originY),this.rotated&&t.rotate(-Math.PI/2),t.scale(this.scale,this.scale),t.lineJoin=\"round\",t.lineCap=\"round\",this.sprite&&t.drawImage(this.sprite.canvas,this.sprite.x,this.sprite.y,this.sprite.w,this.sprite.h),this.effects.drawUnderBalls(t),e.ballInHand?.restricted&&this.drawKitchen(t,a),e.world.balls))n.inPlay&&ta(t,n.p.x,n.p.y,.028575);for(let a of(e.showAim&&e.prediction&&this.drawGuides(t,e),this.drawMotionTrails(t,e.world),e.world.balls)){if(!a.inPlay||0===a.id&&e.ballInHand)continue;let i=e.legalTargets.includes(a.id);ti(t,a,{dim:e.legalTargets.length&&!i&&0!==a.id?.24:0,...this.ballSkin()})}this.drawDrops(t,e.world,a),e.showAim&&e.blockedTarget>=0&&this.drawBlockedMarker(t,e.world.balls[e.blockedTarget],a),e.showCue&&e.cueAlpha>.01&&this.drawCue(t,e),this.effects.draw(t),e.ballInHand&&this.drawBallInHand(t,e,a),e.foulFlash>0&&(t.fillStyle=`rgba(255, 70, 70, ${.09*e.foulFlash})`,t.fillRect(-r,-o,2*r,2*o)),t.restore()}" }, { "path": "renderer", "prototype": "tM", "name": "drawKitchen", "source": "drawKitchen(e,t){e.save(),e.fillStyle=\"rgba(120, 220, 190, 0.07)\",e.fillRect(-r,-o,b+r,2*o),e.strokeStyle=\"rgba(160, 240, 210, 0.55)\",e.lineWidth=.0035,e.setLineDash([.02,.016]),e.lineDashOffset=-(.08*t),e.beginPath(),e.moveTo(b,-o),e.lineTo(b,o),e.stroke(),e.restore()}" }, { "path": "renderer", "prototype": "tM", "name": "drawMotionTrails", "source": "drawMotionTrails(e,t){for(let a of(e.save(),t.balls)){if(!a.inPlay)continue;let t=Math.hypot(a.v.x,a.v.y);if(t<.8)continue;let i=Math.min(1,(t-.8)/4),n=Math.min(.09,.019*t),l=a.v.x/t,r=a.v.y/t,o=_[a.id]??_[0],s=e.createLinearGradient(a.p.x,a.p.y,a.p.x-l*n,a.p.y-r*n);s.addColorStop(0,tT(o.color,.3*i)),s.addColorStop(1,tT(o.color,0)),e.fillStyle=s,e.beginPath(),e.moveTo(a.p.x-.028575*r*.92,a.p.y+.028575*l*.92),e.lineTo(a.p.x+.028575*r*.92,a.p.y-.028575*l*.92),e.lineTo(a.p.x-l*n,a.p.y-r*n),e.closePath(),e.fill()}e.restore()}" }, { "path": "renderer", "prototype": "tM", "name": "drawDrops", "source": "drawDrops(e,t,a){for(let i of this.drops){let n=eL((a-i.t0)/.44,0,1),l=t.balls[i.id];if(!l)continue;let r=n*n,o=i.from.x+(i.to.x-i.from.x)*Math.min(1,1.7*n),s=i.from.y+(i.to.y-i.from.y)*Math.min(1,1.7*n),c={x:l.p.x,y:l.p.y};l.p.x=o,l.p.y=s,e.save();let d=v.reduce((e,t)=>Math.hypot(t.x-i.to.x,t.y-i.to.y)<Math.hypot(e.x-i.to.x,e.y-i.to.y)?t:e);e.beginPath(),e.arc(d.hole.x,d.hole.y,1.02*d.hole.r,0,eI),e.clip(),ti(e,l,{alpha:1-.85*r,scale:1-.42*r,dim:.5*r,...this.ballSkin()}),e.restore(),l.p.x=c.x,l.p.y=c.y}}" }, { "path": "renderer", "prototype": "tM", "name": "drawGuides", "source": "drawGuides(e,t){let a,i=t.prediction;if(i.cuePath.length<2)return;let n=1/this.scale,l=1.15*n,r=t.blockedTarget>=0,o=r?null:(a=t.cue)&&tv[a]||null,s=o?.core??D.line;if(e.save(),e.lineCap=\"butt\",tS(e,i.cuePath,\"rgba(0,0,0,0.28)\",2.2*l),o){for(let[t,a]of(e.lineCap=\"round\",o.glow))tS(e,i.cuePath,t,n*a);e.lineCap=\"butt\"}tS(e,i.cuePath,r?D.blocked:s,l),o?.line?.(e,i.cuePath,l,t.time);let c=i.cuePath.length-1;for(let t=1;t<c;t++){let a=i.cuePath[t];e.beginPath(),e.arc(a.x,a.y,1.6*l,0,eI),e.fillStyle=s,e.fill()}if(!i.ghost||r)return void e.restore();if(o?.ghost?.(e,i.ghost,l,t.time),e.beginPath(),e.arc(i.ghost.x,i.ghost.y,.028575-.5*l,0,eI),e.strokeStyle=\"rgba(0,0,0,0.30)\",e.lineWidth=2.4*l,e.stroke(),e.strokeStyle=o?.core??D.ghost,e.lineWidth=1.1*l,e.stroke(),\"extended\"===t.guideLevel){if(i.objectPath.length>=2){let t=i.objectPocket?\"rgba(150, 255, 200, 0.95)\":D.objectPractice;tS(e,i.objectPath,\"rgba(0,0,0,0.26)\",2.2*l),tS(e,i.objectPath,t,l)}if(i.cuePathAfter.length>=2){let t=!!i.scratchPocket;tS(e,i.cuePathAfter,\"rgba(0,0,0,0.22)\",2*l),tS(e,i.cuePathAfter,t?D.danger:D.cueAfter,l);let a=i.cuePathAfter[i.cuePathAfter.length-1];e.beginPath(),e.arc(a.x,a.y,.0120015,0,eI),e.strokeStyle=t?D.danger:D.cueAfter,e.lineWidth=.9*l,e.stroke()}}else{let a=i.targetId>=0?t.world.balls[i.targetId]:null;if(i.objectDir&&a){let t={x:a.p.x,y:a.p.y},r=Math.min(.165,i.objectReach??1/0),s={x:t.x+i.objectDir.x*r,y:t.y+i.objectDir.y*r};if(tS(e,[t,s],\"rgba(0,0,0,0.26)\",2.2*l),o)for(let[a,i]of o.glow)tS(e,[t,s],a,n*i*.7);tS(e,[t,s],o?.object??D.object,l)}if(i.cueDir){let t=Math.min(.052,i.cueReach??1/0),a={x:i.ghost.x+i.cueDir.x*t,y:i.ghost.y+i.cueDir.y*t};tS(e,[i.ghost,a],\"rgba(0,0,0,0.22)\",2*l),tS(e,[i.ghost,a],o?.cueAfter??D.cueAfter,l)}}if(e.restore(),i.scratchPocket){let a=v.find(e=>e.id===i.scratchPocket);if(a){let i=.55+.45*Math.sin(6*t.time);e.beginPath(),e.arc(a.hole.x,a.hole.y,1.18*a.hole.r,0,eI),e.strokeStyle=`rgba(255, 86, 86, ${.35+.35*i})`,e.lineWidth=2*l,e.stroke()}}}" }, { "path": "renderer", "prototype": "tM", "name": "drawBlockedMarker", "source": "drawBlockedMarker(e,t,a){if(!t||!t.inPlay)return;let i=.0245745*(.95+.05*Math.sin(5.5*a)),n=.24*i,l=(i-.5*n)*Math.SQRT1_2;for(let[a,r]of(e.save(),e.translate(t.p.x,t.p.y),e.beginPath(),e.arc(0,0,.028575,0,eI),e.fillStyle=\"rgba(120, 12, 14, 0.30)\",e.fill(),e.lineCap=\"butt\",[[\"rgba(0,0,0,0.5)\",n+.05*.028575],[D.blockedSolid,n]]))e.strokeStyle=a,e.lineWidth=r,e.beginPath(),e.arc(0,0,i,0,eI),e.stroke(),e.beginPath(),e.moveTo(-l,-l),e.lineTo(l,l),e.stroke();e.restore()}" }, { "path": "renderer", "prototype": "tM", "name": "drawCue", "source": "drawCue(e,t){let a=t.world.balls[0];if(!a.inPlay)return;let i=Math.cos(t.angle),n=Math.sin(t.angle),l=.46*t.spinX*.028575,r=.46*t.spinY*.028575,o=.016+.19*t.pullback,s=a.p.x-i*(.028575+o)+-n*l,c=a.p.y-n*(.028575+o)+i*l,d=-(.35*r);e.save(),e.globalAlpha=t.cueAlpha,e.translate(s+i*d,c+n*d),e.rotate(t.angle);let h=function(e){if(!e||!ec(e))return null;let t=tu.get(e);return t||tp(e),t??null}(t.cue);if(h){let a=1/h.art.pxPerMetre,i=-h.art.tipX*a,n=-h.art.axisY*a,l=h.art.width*a,r=h.art.height*a;e.save(),e.translate(.012,.016),e.globalAlpha*=.38,e.drawImage(h.shadow,i,n,l,r),e.restore(),e.drawImage(h.sprite,i,n,l,r);let o=h.art.glow;h.glow&&o&&(e.save(),e.globalCompositeOperation=\"lighter\",e.globalAlpha*=.78+.22*Math.sin(2.2*t.time),e.drawImage(h.glow,-o.tipX*a,-o.axisY*a,o.width*a,o.height*a),e.restore()),e.restore();return}e.save(),e.translate(.012,.016),e.globalAlpha*=.38,tP(e,$.length,$.tipRadius,$.buttRadius,\"rgba(0,0,0,0.9)\"),e.restore();let u=e.createLinearGradient(0,-$.buttRadius,0,$.buttRadius);u.addColorStop(0,$.shaftLight),u.addColorStop(.42,$.shaft),u.addColorStop(1,\"#8b6534\"),tP(e,$.length,$.tipRadius,$.buttRadius,u),e.save(),e.beginPath(),e.rect(-$.length,-(1.2*$.buttRadius),.46*$.length,2.4*$.buttRadius),e.clip();let f=e.createLinearGradient(0,-$.buttRadius,0,$.buttRadius);f.addColorStop(0,$.buttLight),f.addColorStop(.45,$.butt),f.addColorStop(1,\"#1a0f08\"),tP(e,$.length,$.tipRadius,$.buttRadius,f),e.restore();let g=-(.46*$.length),b=-(.3*$.length);e.save(),e.beginPath(),e.rect(g,-(1.2*$.buttRadius),b-g,2.4*$.buttRadius),e.clip(),tP(e,$.length,$.tipRadius,$.buttRadius,$.wrap),e.strokeStyle=\"rgba(255,255,255,0.08)\",e.lineWidth=8e-4;for(let t=g;t<b;t+=.004)e.beginPath(),e.moveTo(t,-$.buttRadius),e.lineTo(t+.0025,$.buttRadius),e.stroke();e.restore(),tj(e,-(.47*$.length),.012,$,$.collar),tj(e,-(.462*$.length),.002,$,$.ring),tj(e,-(.295*$.length),.0035,$,$.ring),tj(e,-.028,.028,$,$.ferrule),e.beginPath(),e.moveTo(0,-$.tipRadius),e.lineTo(-.006,-$.tipRadius),e.lineTo(-.006,$.tipRadius),e.lineTo(0,$.tipRadius),e.quadraticCurveTo(.0022,0,0,-$.tipRadius),e.closePath(),e.fillStyle=$.tip,e.fill(),e.globalAlpha*=.5,e.beginPath(),e.moveTo(-.03,-(.45*$.tipRadius)),e.lineTo(-(.5*$.length),-(.5*$.buttRadius)),e.strokeStyle=\"rgba(255,240,214,0.55)\",e.lineWidth=.0016,e.stroke(),e.restore()}" }, { "path": "renderer", "prototype": "tM", "name": "drawBallInHand", "source": "drawBallInHand(e,t,a){let i=t.ballInHand,n=t.world.balls[0],l={x:n.p.x,y:n.p.y};n.p.x=i.x,n.p.y=i.y,e.save(),e.globalAlpha=i.legal?.92:.5,ta(e,i.x,i.y,.028575,.6),ti(e,n,{alpha:i.legal?.95:.6,...this.ballSkin()}),e.restore();let r=.6+.4*Math.sin(5.2*a);e.beginPath(),e.arc(i.x,i.y,.028575+.008+.002*r,0,eI),e.strokeStyle=i.legal?`rgba(120, 240, 190, ${.55+.35*r})`:`rgba(255, 96, 96, ${.6+.3*r})`,e.lineWidth=.0032,e.stroke(),i.legal||(e.beginPath(),e.moveTo(i.x-.0142875,i.y-.0142875),e.lineTo(i.x+.0142875,i.y+.0142875),e.moveTo(i.x+.0142875,i.y-.0142875),e.lineTo(i.x-.0142875,i.y+.0142875),e.strokeStyle=\"rgba(255,96,96,0.9)\",e.lineWidth=.0032,e.stroke()),n.p.x=l.x,n.p.y=l.y}" }, { "path": "net", "prototype": "tR", "name": "cueOfShooter", "source": "cueOfShooter(){let e=this.view;return e?e.players[e.turn]?.cue??\"classic\":\"classic\"}" }, { "path": "net", "prototype": "tR", "name": "tableOfViewer", "source": "tableOfViewer(){return this.view?.table?.id??\"classic\"}" }, { "path": "net", "prototype": "tR", "name": "ingest", "source": "ingest(e,t){var a,i;let n,l;if(!tC(e)){this.view=null;return}let r=this.view;this.view=e,this.slot=e.you;let o=(a=t.connected,{matchId:e.matchId??\"\",sequence:e.sequence,serverTime:0,status:tA[e.status],phase:e.phase,turn:e.turn,players:[tN(e.players[0],a),tN(e.players[1],a)],balls:e.balls.map(e=>({id:e.id,x:e.x,y:e.y,inPlay:e.inPlay,pocket:e.pocket})),ballInHand:e.ballInHand,behindHeadString:e.behindHeadString,cuePlaced:e.cuePlaced,winner:e.winner,winKind:e.winKind,rackNumber:e.rackNumber,busyForMs:e.busyForMs,potted:(n=(i=e).balls.filter(e=>0!==e.id&&!e.inPlay).map(e=>e.id),[...l=(i.potted??[]).filter(e=>n.includes(e)),...n.filter(e=>!l.includes(e)).sort((e,t)=>e-t)])});this.latest=o;let s=JSON.stringify({...o,busyForMs:0,serverTime:0}),c=null===r;this.syncPresence(e,t),this.syncArrival(e,r),c||\"active\"===r.status||\"active\"!==e.status||this.emit(\"gameStarted\",{state:o});let d=e.lastShot,h=d?`${d.at}:${d.by}`:\"\";d&&h!==this.lastShotKey?(this.lastShotKey=h,!(c&&e.busyForMs<=0)&&(this.emitShot(e,d,o),c||(this.lastStateKey=s))):d||(this.lastShotKey=\"\"),s!==this.lastStateKey&&(this.lastStateKey=s,this.emit(\"state\",o))}" }, { "path": "net", "prototype": "tR", "name": "emitShot", "source": "emitShot(e,t,a){var i;let n;this.emit(\"started\",{sequence:e.sequence,by:t.by,shot:t.shot,cue:t.cue,startedAt:t.at,durationMs:t.durationMs}),this.emit(\"physics\",{sequence:e.sequence,replay:function(e){let t=atob(e),a=new Uint8Array(t.length);for(let e=0;e<t.length;e++)a[e]=t.charCodeAt(e);return a.buffer}(t.replay),durationMs:t.durationMs},(i=e.busyForMs,(n=t.durationMs+(t.pauseMs??0)-i)>400?n:0)),this.emit(\"finished\",{sequence:e.sequence,outcome:t.outcome,state:a})}" }, { "path": "net", "prototype": "tR", "name": "receiveAim", "source": "receiveAim(e){e&&\"number\"==typeof e.angle&&(this.view?.you===null||this.view?.you===void 0||e.by!==this.view.you)&&this.emit(\"opponentAim\",{angle:e.angle,power:e.power??0,spinX:e.spinX??0,spinY:e.spinY??0,cue:e.cue??null,charging:!0===e.charging})}" }, { "path": "net", "prototype": "tR", "name": "sendAim", "source": "sendAim(e){let t=this.view;if(t&&null!==t.you&&t.turn!==t.you)return;let a=performance.now();this.send(\"aim\",{angle:e.angle,power:e.power,spinX:e.spinX,spinY:e.spinY,cue:e.cue??null,charging:!0===e.charging}).then(e=>{e.ok&&this.noteRoundTrip(performance.now()-a)}).catch(()=>{})}" }, { "path": "net", "prototype": "tR", "name": "placeCue", "source": "placeCue(e,t,a){return this.command(\"placeCue\",{x:e,y:t})}" }, { "path": "net", "prototype": "tR", "name": "claimTurnTimeout", "source": "claimTurnTimeout(){return this.command(\"claimTurnTimeout\")}" }, { "path": "player", "prototype": "tI", "name": "load", "source": "load(e,t){this.set(function(e){let t=new DataView(e),a=0,i=t.getUint16(a,!0);a+=2;let n=t.getUint16(a,!0);a+=2;let l=t.getUint16(a,!0);a+=4;let r=[];for(let e=0;e<i;e++){let e=t.getUint16(a,!0);a+=2;let i=t.getUint16(a,!0);a+=2;let n={t:e,mask:0,x:new Float64Array(16),y:new Float64Array(16),wx:new Float64Array(16),wy:new Float64Array(16),wz:new Float64Array(16)};n.mask=i;for(let e=0;e<16;e++)(i&1<<e)!=0&&(n.x[e]=t.getInt16(a,!0)/2e4,a+=2,n.y[e]=t.getInt16(a,!0)/2e4,a+=2,n.wx[e]=t.getInt16(a,!0)/40,a+=2,n.wy[e]=t.getInt16(a,!0)/40,a+=2,n.wz[e]=t.getInt16(a,!0)/40,a+=2);r.push(n)}let o=[];for(let e=0;e<l;e++){let e=t_[t.getUint8(a)]??\"ballBall\";a+=1;let i=t.getUint16(a,!0);a+=2;let n=t.getUint8(a);a+=1;let l=t.getUint8(a);a+=1;let r=t.getUint8(a);a+=1;let s=t.getUint16(a,!0)/500;a+=2;let c=t.getInt16(a,!0)/2e4;a+=2;let d=t.getInt16(a,!0)/2e4;a+=2;let h=t.getInt8(a)/127;a+=1;let u=t.getInt8(a)/127;a+=1,o.push({type:e,t:i,a:n,b:255===l?-1:l,pocket:255===r?null:tz[r]??null,speed:s,x:c,y:d,nx:h,ny:u})}return{durationMs:n,frames:r,events:o}}(e),t)}" }, { "path": "player", "prototype": "tI", "name": "set", "source": "set(e,t){this.tracks=[];for(let t=0;t<16;t++){let a=0;for(let i of e.frames)i.mask&1<<t&&a++;let i={n:0,t:new Float64Array(a),x:new Float64Array(a),y:new Float64Array(a),wx:new Float64Array(a),wy:new Float64Array(a),wz:new Float64Array(a),cursor:0,end:0,present:a>0,pocketAt:1/0};this.tracks.push(i)}for(let t of e.frames)for(let e=0;e<16;e++){if((t.mask&1<<e)==0)continue;let a=this.tracks[e],i=a.n++;a.t[i]=t.t,a.x[i]=t.x[e],a.y[i]=t.y[e],a.wx[i]=t.wx[e],a.wy[i]=t.wy[e],a.wz[i]=t.wz[e]}for(let e of this.tracks)e.end=e.n>0?e.t[e.n-1]:0;for(let t of e.events){if(\"pocket\"!==t.type)continue;let e=this.tracks[t.a];e&&(e.pocketAt=Math.min(e.pocketAt,t.t))}for(this.events=e.events,this.duration=e.durationMs,this.time=Math.max(0,t),this.eventCursor=0;this.eventCursor<this.events.length&&this.events[this.eventCursor].t<this.time;)this.eventCursor++}" }, { "path": "player", "prototype": "tI", "name": "sample", "source": "sample(e,t,a){let i=t.balls[a],n=this.time;if(n>=e.pocketAt&&(i.inPlay=!1),n<=e.t[0]){i.p.x=e.x[0],i.p.y=e.y[0],i.w.x=e.wx[0],i.w.y=e.wy[0],i.w.z=e.wz[0],i.v.x=0,i.v.y=0;return}if(n>=e.end){let t=e.n-1;i.p.x=e.x[t],i.p.y=e.y[t],i.w.x=0,i.w.y=0,i.w.z=0,i.v.x=0,i.v.y=0;return}let l=e.cursor;for((l>=e.n-1||e.t[l]>n)&&(l=0);l<e.n-2&&e.t[l+1]<=n;)l++;e.cursor=l;let r=e.t[l+1]-e.t[l],o=r>0?(n-e.t[l])/r:0,s=e.x[l+1]-e.x[l],c=e.y[l+1]-e.y[l];i.p.x=e.x[l]+s*o,i.p.y=e.y[l]+c*o;let d=r>0?1e3/r:0;i.v.x=s*d,i.v.y=c*d,i.w.x=e.wx[l]+(e.wx[l+1]-e.wx[l])*o,i.w.y=e.wy[l]+(e.wy[l+1]-e.wy[l])*o,i.w.z=e.wz[l]+(e.wz[l+1]-e.wz[l])*o}" }, { "path": "renderer.effects", "prototype": "tl", "name": "clear", "source": "clear(){for(let e of this.particles)e.active=!1;for(let e of this.rings)e.active=!1;this.pocketGlow.clear()}" }, { "path": "renderer.effects", "prototype": "tl", "name": "emit", "source": "emit(e,t){switch(e.type){case\"ballBall\":{let t=Math.min(14,3+Math.round(3*e.speed));for(let a=0;a<t;a++){let t=this.particle(),a=(Math.random()-.5)*2.4,i=-e.ny,n=e.nx,l=.12+.42*Math.random()*Math.min(2.2,e.speed);t.active=!0,t.x=e.x,t.y=e.y,t.vx=(i*Math.cos(a)+e.nx*Math.sin(a)*.35)*l,t.vy=(n*Math.cos(a)+e.ny*Math.sin(a)*.35)*l,t.life=t.maxLife=.16+.2*Math.random(),t.size=.0012+.0016*Math.random(),t.drag=7,t.r=226,t.g=240,t.b=236}if(e.speed>1.4){let t=this.ring();t.active=!0,t.x=e.x,t.y=e.y,t.from=.0085725,t.to=.028575*(1.1+Math.min(1.2,.25*e.speed)),t.life=t.maxLife=.17,t.width=.0016,t.color=\"rgba(255,255,255,0.5)\"}break}case\"cushion\":case\"jaw\":{let t=Math.min(10,2+Math.round(2.2*e.speed));for(let a=0;a<t;a++){let t=this.particle(),a=Math.atan2(e.ny,e.nx)+(Math.random()-.5)*2,i=.1+.36*Math.random()*Math.min(2,e.speed);t.active=!0,t.x=e.x,t.y=e.y,t.vx=Math.cos(a)*i,t.vy=Math.sin(a)*i,t.life=t.maxLife=.13+.16*Math.random(),t.size=.0011+.0013*Math.random(),t.drag=9,t.r=190,t.g=226,t.b=212}break}case\"pocket\":{let t,a=v.find(t=>t.id===e.pocket);if(!a)break;this.pocketGlow.set(a.id,.5);let[i,n,l]=[(t=parseInt((_[e.a]??_[0]).color.slice(1),16))>>16&255,t>>8&255,255&t];for(let e=0;e<16;e++){let e=this.particle(),t=Math.random()*eI,r=.06+.3*Math.random();e.active=!0,e.x=a.x-.012*a.dirX,e.y=a.y-.012*a.dirY,e.vx=Math.cos(t)*r-.1*a.dirX,e.vy=Math.sin(t)*r-.1*a.dirY,e.life=e.maxLife=.28+.3*Math.random(),e.size=.0013+.0019*Math.random(),e.drag=5,e.r=i,e.g=n,e.b=l}let r=this.ring();r.active=!0,r.x=a.hole.x,r.y=a.hole.y,r.from=.6*a.hole.r,r.to=2.1*a.hole.r,r.life=r.maxLife=.46,r.width=.0035,r.color=W}}}" }, { "path": "renderer.effects", "prototype": "tl", "name": "update", "source": "update(e){for(let t of this.particles){if(!t.active)continue;if(t.life-=e,t.life<=0){t.active=!1;continue}let a=Math.exp(-t.drag*e);t.x+=t.vx*e,t.y+=t.vy*e,t.vx*=a,t.vy*=a}for(let t of this.rings)t.active&&(t.life-=e,t.life<=0&&(t.active=!1));for(let[t,a]of this.pocketGlow){let i=a-e;i<=0?this.pocketGlow.delete(t):this.pocketGlow.set(t,i)}}" }, { "path": "renderer.effects", "prototype": "tl", "name": "glowFor", "source": "glowFor(e){return this.pocketGlow.get(e)??0}" }, { "path": "renderer.effects", "prototype": "tl", "name": "drawUnderBalls", "source": "drawUnderBalls(e){for(let[t,a]of this.pocketGlow){let i=v.find(e=>e.id===t);if(!i)continue;let n=a/.5,l=e.createRadialGradient(i.hole.x,i.hole.y,0,i.hole.x,i.hole.y,1.8*i.hole.r);l.addColorStop(0,`rgba(255,226,170,${.34*n})`),l.addColorStop(1,\"rgba(255,226,170,0)\"),e.fillStyle=l,e.beginPath(),e.arc(i.hole.x,i.hole.y,1.8*i.hole.r,0,eI),e.fill()}}" }, { "path": "renderer.effects", "prototype": "tl", "name": "draw", "source": "draw(e){for(let t of(e.save(),e.globalCompositeOperation=\"lighter\",this.particles)){if(!t.active)continue;let a=t.life/t.maxLife;e.fillStyle=`rgba(${t.r},${t.g},${t.b},${.62*a*a})`,e.beginPath(),e.arc(t.x,t.y,t.size*(.5+a),0,eI),e.fill()}for(let t of(e.restore(),this.rings)){if(!t.active)continue;let a=1-t.life/t.maxLife,i=t.from+(t.to-t.from)*(1-(1-a)*(1-a));e.globalAlpha=1-a,e.strokeStyle=t.color,e.lineWidth=t.width*(1-.5*a),e.beginPath(),e.arc(t.x,t.y,i,0,eI),e.stroke(),e.globalAlpha=1}}" }, { "path": "renderer.ctx", "prototype": "CanvasRenderingContext2D", "name": "drawFocusIfNeeded", "source": "function drawFocusIfNeeded() { [native code] }" }, { "path": "renderer.ctx", "prototype": "CanvasRenderingContext2D", "name": "drawImage", "source": "function drawImage() { [native code] }" }, { "path": "renderer.ctx", "prototype": "CanvasRenderingContext2D", "name": "isPointInPath", "source": "function isPointInPath() { [native code] }" }, { "path": "renderer.ctx", "prototype": "CanvasRenderingContext2D", "name": "isPointInStroke", "source": "function isPointInStroke() { [native code] }" }, { "path": "renderer.ctx", "prototype": "CanvasRenderingContext2D", "name": "strokeText", "source": "function strokeText() { [native code] }" }, { "path": "renderer.ctx", "prototype": "CanvasRenderingContext2D", "name": "beginPath", "source": "function beginPath() { [native code] }" }, { "path": "renderer.ctx", "prototype": "CanvasRenderingContext2D", "name": "closePath", "source": "function closePath() { [native code] }" } ], "bundles": [ { "url": "https://1536454561869332530.discordsays.com/_next/static/chunks/0gtf7gqm4h522.js", "bytes": 250538, "score": 126, "excerpts": [ { "term": "refreshPrediction", "offset": 213730, "excerpt": "er:0;if(this.pullback+=(a-this.pullback)*Math.min(1,e*(t?22:14)),0!==this.turnHold&&\"aiming\"===this.phase){let t=(performance.now()-this.turnHoldAt)/1e3;if(1e3*t>=260){let a=Math.min(1,(t-.26)/1.5);this.nudgeAim(this.turnHold*(.07+.13*a*a)*e*(this.fineAim?.1:1))}}if(this.spaceDown){let e=(this.now-this.spaceStart)/900;this.power=eL(.1+(e%2<1?e%1:1-e%1)*.95,.05,1),this.pullback=this.power,this.predictionDirty=!0}this.refreshPrediction();break}case\"charging\":this.pullback+=(this.power-this.pullback)*Math.min(1,22*e),this.refreshPrediction();break;case\"shooting\":{if(null===this.strokeAt){let e=this.now-this.shootStart,t=eL(e/220,0,1);if(this.pullback=this.power*(1+.06*(1-(1-t)*(1-t))),!this.pendingReplay&&e<this.setFor)break;this.strokeAt=this.now,this.strokeFrom=this.pullback}let e=eL((this.now-this.strokeAt)/this.strokeMs,0,1);this.pullback=this.strokeFrom*(1-e*e),e>=1&&(this.pullback=0,eK.cueStrike(this.power),this.pendingReplay?this.beginPlayback():this.phase=\"sending\");break}case\"sending\":this.pendingReplay?this.beginPlayback():null!==this.shotUnsureAt&&this.now-this.shotUnsureAt>=12e3&&this.abandonShot();break;case\"playing\":for(let a of(this.cueAlpha=Math.max(0,this.cueAlpha-8*e),this.player.advanc" }, { "term": "cuePath", "offset": 150730, "excerpt": ",783.99,1046.5].forEach((t,a)=>this.tone(e+.085*a,.34,.17,t,t,\"triangle\"))}lose(){if(!this.ready())return;let e=this.ctx.currentTime;[392,349.23,293.66].forEach((t,a)=>this.tone(e+.12*a,.42,.15,t,.98*t,\"sine\"))}uiTap(){if(!this.ready())return;let e=this.ctx.currentTime;this.burst(e,.03,.08,\"highpass\",2400,.7)}uiConfirm(){if(!this.ready())return;let e=this.ctx.currentTime;this.tone(e,.09,.12,660,880,\"triangle\")}},eO={cuePath:[],ghost:null,targetId:-1,objectPath:[],cuePathAfter:[],objectDir:null,cueDir:null,objectPocket:null,scratchPocket:null,railsBeforeContact:0,cutAngle:0/0,objectReach:1/0,cueReach:1/0};function eQ(e,t,a){let i=e.cueBall;if(!i.inPlay)return eO;let n=Math.cos(t),l=Math.sin(t),r=i.p.x,o=i.p.y,s=3,c=-1;for(let t=1;t<16;t++){let a=e.balls[t];if(!a.inPlay)continue;let i=a.p.x-r,d=a.p.y-o,h=i*n+d*l;if(h<=0)continue;let u=i*i+d*d-h*h,f=.0032661225;if(u>=.0032661225)continue;let g=h-Math.sqrt(f-u);g<0||g>=s||(s=g,c=t)}let d=c<0?eZ(r,o,n,l):3,h=Math.min(s,d,e0(r,o,n,l));h<s&&(c=-1);let u={x:r+n*h,y:o+l*h},f=[{x:r,y:o},u];if(c<0)return{...eO,cuePath:f,railsBeforeContact:+(h===d)};let g=e.balls[c],b=g.p.x-u.x,m=g.p.y-u.y,w=Math.hypot(b,m)||1,y=n*(b/=w)+l*(m/=w),x=n-y*b,k=l-y*m,v=x+p*y*b,M=k+p*y" }, { "term": "objectPath", "offset": 150764, "excerpt": "s.tone(e+.085*a,.34,.17,t,t,\"triangle\"))}lose(){if(!this.ready())return;let e=this.ctx.currentTime;[392,349.23,293.66].forEach((t,a)=>this.tone(e+.12*a,.42,.15,t,.98*t,\"sine\"))}uiTap(){if(!this.ready())return;let e=this.ctx.currentTime;this.burst(e,.03,.08,\"highpass\",2400,.7)}uiConfirm(){if(!this.ready())return;let e=this.ctx.currentTime;this.tone(e,.09,.12,660,880,\"triangle\")}},eO={cuePath:[],ghost:null,targetId:-1,objectPath:[],cuePathAfter:[],objectDir:null,cueDir:null,objectPocket:null,scratchPocket:null,railsBeforeContact:0,cutAngle:0/0,objectReach:1/0,cueReach:1/0};function eQ(e,t,a){let i=e.cueBall;if(!i.inPlay)return eO;let n=Math.cos(t),l=Math.sin(t),r=i.p.x,o=i.p.y,s=3,c=-1;for(let t=1;t<16;t++){let a=e.balls[t];if(!a.inPlay)continue;let i=a.p.x-r,d=a.p.y-o,h=i*n+d*l;if(h<=0)continue;let u=i*i+d*d-h*h,f=.0032661225;if(u>=.0032661225)continue;let g=h-Math.sqrt(f-u);g<0||g>=s||(s=g,c=t)}let d=c<0?eZ(r,o,n,l):3,h=Math.min(s,d,e0(r,o,n,l));h<s&&(c=-1);let u={x:r+n*h,y:o+l*h},f=[{x:r,y:o},u];if(c<0)return{...eO,cuePath:f,railsBeforeContact:+(h===d)};let g=e.balls[c],b=g.p.x-u.x,m=g.p.y-u.y,w=Math.hypot(b,m)||1,y=n*(b/=w)+l*(m/=w),x=n-y*b,k=l-y*m,v=x+p*y*b,M=k+p*y*m,S=Math.hypot(v,M);return{...eO," }, { "term": "pocket", "offset": 149523, "excerpt": "this.ready()||!this.allow())return;let t=this.ctx.currentTime,a=Math.min(1,e/4.2),i=2100+1500*a+380*Math.random();this.burst(t,.045+.02*a,.1+.36*a,\"bandpass\",i,2.4),this.tone(t,.035+.02*a,.05+.16*a,.92*i,.55*i,\"triangle\")}cushion(e){if(!this.ready()||!this.allow())return;let t=this.ctx.currentTime,a=Math.min(1,e/4);this.burst(t,.075+.03*a,.06+.2*a,\"lowpass\",620+520*a,.8),this.tone(t,.09,.04+.14*a,190+90*a,90,\"sine\")}pocket(){if(!this.ready())return;let e=this.ctx.currentTime;this.tone(e,.13,.22,340,120,\"sine\"),this.burst(e+.02,.1,.14,\"lowpass\",900,.7),this.burst(e+.14,.13,.1,\"bandpass\",1500,1.4),this.tone(e+.16,.2,.12,150,62,\"sine\")}cueStrike(e){if(!this.ready())return;let t=this.ctx.currentTime,a=Math.min(1,Math.max(.05,e));this.burst(t,.05,.1+.3*a,\"bandpass\",900+700*a,1.1),this.tone(t,.05,.05+.14*a,520+260*a,180,\"triangle\")}rack(){if(!this.ready())return;let e=this.ctx.currentTime;for(let t=0;t<7;t++)this.burst(e+.022*t+.01*Math.random(),.05,.1,\"bandpass\",1600+1400*Math.random(),2)}foul(){if(!this.ready())return;let e=this.ctx.currentTime;this.tone(e,.14,.16,300,190,\"square\"),this.tone(e+.11,.2,.14,205,130,\"square\")}win(){if(!this.ready())return;let e=this.ctx.currentTime;[523.25,659.25,783.99,1046." }, { "term": "ghost", "offset": 8745, "excerpt": "allDeep:\"#140b07\",innerLight:\"rgba(120, 150, 140, 0.14)\"},G=\"rgba(0,0,0,0.5)\",E={x:.42,y:.56,z:.72,shadowOffset:.42,shadowBlur:.55,shadowAlpha:.42},$={tip:\"#3f6fa8\",ferrule:\"#f2ece0\",shaft:\"#d8b07a\",shaftLight:\"#f0d3a6\",collar:\"#1b1b1f\",ring:\"#c9a227\",butt:\"#2c1b12\",buttLight:\"#5e3a24\",wrap:\"#16181c\",length:.82,tipRadius:.0044,buttRadius:.0108},D={line:\"rgba(255, 255, 255, 0.90)\",lineSoft:\"rgba(255, 255, 255, 0.22)\",ghost:\"rgba(255, 255, 255, 0.92)\",ghostFill:\"rgba(255, 255, 255, 0.06)\",object:\"rgba(255, 255, 255, 0.86)\",objectPractice:\"rgba(255, 228, 150, 0.95)\",cueAfter:\"rgba(158, 206, 255, 0.72)\",danger:\"rgba(255, 96, 96, 0.95)\",blocked:\"rgba(255, 118, 110, 0.80)\",blockedSolid:\"#ff5a52\"},W=\"rgba(255, 238, 196, 0.85)\",U=(()=>{let{x:e,y:t,z:a}=E,i=Math.hypot(e,t,a);return{x:e/i,y:t/i,z:a/i}})();function F({id:e,size:a=22,potted:n=!1,title:l}){let r=(0,i.useId)().replace(/:/g,\"\"),o=_[e]??_[0],s=e>8;return(0,t.jsxs)(\"svg\",{width:a,height:a,viewBox:\"0 0 32 32\",role:l?\"img\":\"presentation\",\"aria-label\":l,style:{display:\"block\",opacity:n?.26:1,filter:n?\"grayscale(0.55)\":\"drop-shadow(0 1px 2px rgba(0,0,0,0.5))\",transition:\"opacity 0.35s var(--ease), filter 0.35s var(--ease)\"},children:[(0,t.jsxs)(\"defs\",{ch" } ] }, { "url": "https://1536454561869332530.discordsays.com/_next/static/chunks/19db_hr8jwljq.js", "bytes": 2746, "score": 12, "excerpts": [ { "term": "pocket", "offset": 1280, "excerpt": "rer ${c}`,...t?{\"content-type\":\"application/json\"}:{}},body:t?JSON.stringify(t):void 0})}catch{return{ok:!1,code:\"UNAVAILABLE\"}}let d=await n.json().catch(()=>null);return n.ok&&d?.data?{ok:!0,wardrobe:(i=d.data,o=e=>e.filter(e=>e.owned).map(e=>e.id),l=i.throwables.some(e=>null===e.held),{coins:i.coins,verified:i.verified,owned:{name:o(i.names),frame:o(i.frames),fx:o(i.effects),theme:o(i.themes)},equipped:i.equipped,pocket:l?null:Object.fromEntries(i.throwables.map(e=>[e.id,e.held??0])),usedToday:i.usedToday,dailyThrows:i.dailyThrows})}:{ok:!1,code:d?.details?.code??d?.code??\"UNAVAILABLE\"}}var c=e.i(76522);e.s([\"UnoStore\",0,function({onClose:e}){let[s,d]=(0,t.useState)(null),[u,f]=(0,t.useState)(!1),h=(0,t.useMemo)(()=>{let e;return e=e=>e.ok?(d(e.wardrobe),{ok:!0,wardrobe:e.wardrobe}):e,{buy:async(a,t)=>e(await l(\"/purchase\",\"POST\",{kind:a,id:t})),wear:async a=>e(await l(\"/equip\",\"PATCH\",a)),buyPack:async(a,t)=>e(await l(\"/packs\",\"POST\",{id:a,size:t,idemKey:(0,o.Z)()}))}},[]),m=(0,r.v)()?.user,b={name:m?.globalName||m?.username||\"You\",avatar:function(e){if(!e?.id)return null;if(e.avatar)return`https://cdn.discordapp.com/avatars/${e.id}/${e.avatar}.png?size=128`;let a=0;try{a=Number((BigInt(e.id)>>Big" } ] }, { "url": "https://1536454561869332530.discordsays.com/_next/static/chunks/2zhaf-xcw67tg.js", "bytes": 46836, "score": 12, "excerpts": [ { "term": "pocket", "offset": 35868, "excerpt": ",fx:\"Plays for everyone at the table when you call UNO.\",theme:\"Only you see your theme: cards, back and table.\",throw:\"Tap a player's picture during a game to throw one.\"},rarity:{common:\"Common\",rare:\"Rare\",epic:\"Epic\",legendary:\"Legendary\"},buy:e=>`Buy & wear \\xb7 ${e}`,wear:\"Wear\",wearing:\"Wearing\",free:\"Free\",owned:\"Owned\",busy:\"One moment…\",preview:\"Preview\",held:e=>`You have ${e}`,heldUnknown:\"Can't read your pocket\",pack:(e,a)=>`\\xd7${e} \\xb7 ${a}`,today:(e,a)=>`${e} of ${a} throws used today`,throwsAtMe:\"Throws at me\",throwsIn:{all:\"Everything\",hearts:\"Friendly only\",off:\"Nothing\"},friendly:\"Friendly\",playful:\"Playful\",coinsUnknown:\"—\",unverified:\"The shop can't read what you own right now. You can still wear free looks.\",errors:{INSUFFICIENT_FUNDS:\"Not enough EPIX for this yet.\",ALREADY_OWNED:\"You already own this.\",NOT_OWNED:\"You don't own that look.\",BLOCKED_SPEND:\"Your account can't buy right now.\",UNAVAILABLE:\"The shop can't reach your wallet right now — try again in a moment.\",DEFAULT:\"That didn't go through. You were not charged twice.\"}},U={name:N.NAMES,frame:N.FRAMES,fx:t.EFFECTS,theme:t.THEMES},O=[\"name\",\"frame\",\"fx\",\"theme\",\"throw\"],R=N.RARITY_COLORS,D=e=>`${new Intl.NumberFormat(\"" } ] }, { "url": "https://1536454561869332530.discordsays.com/_next/static/chunks/1f3_j0-7srs8o.js", "bytes": 180551, "score": 3, "excerpts": [ { "term": "rail", "offset": 964, "excerpt": "\"!==u&&Object.prototype.hasOwnProperty.call(e,u)){var o=l?Object.getOwnPropertyDescriptor(e,u):null;o&&(o.get||o.set)?Object.defineProperty(a,u,o):a[u]=e[u]}return a.default=e,r&&r.set(e,a),a}},5550,(e,t,r)=>{e.i(47167),Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"addBasePath\",{enumerable:!0,get:function(){return l}});let n=e.r(41858),a=e.r(82823);function l(e,t){return(0,a.normalizePathTrailingSlash)((0,n.addPathPrefix)(e,\"\"))}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},32120,(e,t,r)=>{Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"callServer\",{enumerable:!0,get:function(){return n.callServer}});let n=e.r(48658);(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},92245,(e,t,r)=>{let n;e.i(47167),Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"findSourceMapURL\",{enumerable:!0,get:function(){" } ] }, { "url": "https://1536454561869332530.discordsays.com/_next/static/chunks/0eobm8ikdrr9l.js", "bytes": 62120, "score": 3, "excerpts": [ { "term": "rail", "offset": 15942, "excerpt": "ame||(\"u\">typeof location?location.hostname:\"localhost\"),this.port=e.port||(\"u\">typeof location&&location.port?location.port:this.secure?\"443\":\"80\"),this.transports=[],this._transportsByName={},e.transports.forEach(t=>{let e=t.prototype.name;this.transports.push(e),this._transportsByName[e]=t}),this.opts=Object.assign({path:\"/engine.io\",agent:!1,withCredentials:!1,upgrade:!0,timestampParam:\"t\",rememberUpgrade:!1,addTrailingSlash:!0,rejectUnauthorized:!0,perMessageDeflate:{threshold:1024},transportOptions:{},closeOnBeforeunload:!1},e),this.opts.path=this.opts.path.replace(/\\/$/,\"\")+(this.opts.addTrailingSlash?\"/\":\"\"),\"string\"==typeof this.opts.query&&(this.opts.query=function(t){let e={},s=t.split(\"&\");for(let t=0,i=s.length;t<i;t++){let i=s[t].split(\"=\");e[decodeURIComponent(i[0])]=decodeURIComponent(i[1])}return e}(this.opts.query)),X&&(this.opts.closeOnBeforeunload&&(this._beforeunloadEventListener=()=>{this.transport&&(this.transport.removeAllListeners(),this.transport.close())},addEventListener(\"beforeunload\",this._beforeunloadEventListener,!1)),\"localhost\"!==this.hostname&&(this._offlineEventListener=()=>{this._onClose(\"transport close\",{description:\"network connection lost\"})},Q.push(this._offli" } ] } ], "bundleFetchErrors": [], "live": { "capturedAt": "2026-11-02T16:53:32.935Z", "page": { "origin": "https://1536454561869332530.discordsays.com", "insideGameFrame": true, "viewport": [ 864, 532 ], "pixelRatio": 1.218749761581421, "phase": "ballInHand", "screenPhase": "ballInHand", "turn": "0" }, "engine": { "phase": "ballInHand", "aimAngle": -0.366057, "power": 1, "spinX": 0, "spinY": 0, "pullback": 0, "cueAlpha": 1, "predictionDirty": false, "prediction": { "cuePath": [ { "x": -0.4953, "y": 0 }, { "x": 0.191626, "y": -0.263322 } ], "ghost": { "x": 0.191626, "y": -0.263322 }, "targetId": 15, "objectPath": [], "cuePathAfter": [], "objectDir": { "x": 0.986777, "y": 0.162084 }, "cueDir": { "x": 0.204112, "y": -0.978948 }, "objectPocket": null, "scratchPocket": null, "railsBeforeContact": 0, "cutAngle": 0.528859, "objectReach": 0.723572, "cueReach": 0.207777 }, "blockedTarget": -1, "viewBalls": [ { "id": 0, "group": "cue", "p": { "x": -0.4953, "y": 0 }, "v": { "x": 0, "y": 0 }, "w": { "x": 0, "y": 0, "z": 0 }, "orient": { "type": "Float64Array", "length": 9, "values": [ -0.639194, -0.634319, 0.434823, -0.728783, 0.68016, -0.079103, -0.245573, -0.367453, -0.897035 ] }, "inPlay": true, "pocket": null }, { "id": 1, "group": "solid", "p": { "x": -0.039226, "y": -0.278441 }, "v": { "x": 0, "y": 0 }, "w": { "x": 0, "y": 0, "z": 0 }, "orient": { "type": "Float64Array", "length": 9, "values": [ 0.536329, 0.378206, 0.754528, 0.230215, -0.925636, 0.300333, 0.812005, 0.012627, -0.583513 ] }, "inPlay": true, "pocket": null }, { "id": 2, "group": "solid", "p": { "x": 1.021465, "y": -0.526165 }, "v": { "x": 0, "y": 0 }, "w": { "x": 0, "y": 0, "z": 0 }, "orient": { "type": "Float64Array", "length": 9, "values": [ 0.192896, -0.915094, -0.354109, -0.000893, -0.36105, 0.932546, -0.981219, -0.179568, -0.070463 ] }, "inPlay": false, "pocket": "topRight" }, { "id": 3, "group": "solid", "p": { "x": 0.123323, "y": 0.381355 }, "v": { "x": 0, "y": 0 }, "w": { "x": 0, "y": 0, "z": 0 }, "orient": { "type": "Float64Array", "length": 9, "values": [ -0.210475, -0.092405, -0.973222, 0.524707, 0.829298, -0.192217, 0.824853, -0.551113, -0.126061 ] }, "inPlay": true, "pocket": null }, { "id": 4, "group": "solid", "p": { "x": 0.616993, "y": 0.204055 }, "v": { "x": 0, "y": 0 }, "w": { "x": 0, "y": 0, "z": 0 }, "orient": { "type": "Float64Array", "length": 9, "values": [ -0.580965, -0.229235, 0.780981, 0.573164, 0.566043, 0.592518, -0.577894, 0.791863, -0.197462 ] }, "inPlay": true, "pocket": null }, { "id": 5, "group": "solid", "p": { "x": 0.251337, "y": 0.360561 }, "v": { "x": 0, "y": 0 }, "w": { "x": 0, "y": 0, "z": 0 }, "orient": { "type": "Float64Array", "length": 9, "values": [ 0.121432, 0.031512, 0.992099, -0.917369, 0.385259, 0.100048, -0.379063, -0.92227, 0.075691 ] }, "inPlay": true, "pocket": null }, { "id": 6, "group": "solid", "p": { "x": 0.116962, "y": 0.249824 }, "v": { "x": 0, "y": 0 }, "w": { "x": 0, "y": 0, "z": 0 }, "orient": { "type": "Float64Array", "length": 9, "values": [ -0.516971, 0.186249, -0.835495, 0.587266, -0.63295, -0.504474, -0.622784, -0.751456, 0.217839 ] }, "inPlay": true, "pocket": null }, { "id": 7, "group": "solid", "p": { "x": -1.021465, "y": -0.526165 }, "v": { "x": 0, "y": 0 }, "w": { "x": 0, "y": 0, "z": 0 }, "orient": { "type": "Float64Array", "length": 9, "values": [ -0.513551, 0.681692, 0.521116, -0.729123, -0.666872, 0.153822, 0.452377, -0.300962, 0.83951 ] }, "inPlay": false, "pocket": "topLeft" }, { "id": 8, "group": "eight", "p": { "x": 0.20002, "y": 0.457782 }, "v": { "x": 0, "y": 0 }, "w": { "x": 0, "y": 0, "z": 0 }, "orient": { "type": "Float64Array", "length": 9, "values": [ 0.973919, -0.183742, -0.133121, 0.125004, -0.055129, 0.990623, -0.189358, -0.981427, -0.030723 ] }, "inPlay": true, "pocket": null }, { "id": 9, "group": "stripe", "p": { "x": -0.872744, "y": -0.057685 }, "v": { "x": 0, "y": 0 }, "w": { "x": 0, "y": 0, "z": 0 }, "orient": { "type": "Float64Array", "length": 9, "values": [ -0.570275, 0.69273, 0.441488, 0.005304, -0.53433, 0.845259, 0.821437, 0.484371, 0.301041 ] }, "inPlay": true, "pocket": null }, { "id": 10, "group": "stripe", "p": { "x": -0.184468, "y": 0.139737 }, "v": { "x": 0, "y": 0 }, "w": { "x": 0, "y": 0, "z": 0 }, "orient": { "type": "Float64Array", "length": 9, "values": [ -0.169558, 0.388685, -0.905635, 0.778616, 0.616176, 0.118677, 0.604158, -0.685019, -0.407113 ] }, "inPlay": true, "pocket": null }, { "id": 11, "group": "stripe", "p": { "x": 0.356587, "y": 0.42555 }, "v": { "x": 0, "y": 0 }, "w": { "x": 0, "y": 0, "z": 0 }, "orient": { "type": "Float64Array", "length": 9, "values": [ -0.409687, 0.755881, 0.510686, -0.815133, -0.554664, 0.167051, 0.40953, -0.347839, 0.843382 ] }, "inPlay": true, "pocket": null }, { "id": 12, "group": "stripe", "p": { "x": 0.659868, "y": 0.458733 }, "v": { "x": 0, "y": 0 }, "w": { "x": 0, "y": 0, "z": 0 }, "orient": { "type": "Float64Array", "length": 9, "values": [ 0.925295, -0.198187, 0.323344, -0.313494, -0.879507, 0.358034, 0.213426, -0.432653, -0.875934 ] }, "inPlay": true, "pocket": null }, { "id": 13, "group": "stripe", "p": { "x": 0.184987, "y": 0.364461 }, "v": { "x": 0, "y": 0 }, "w": { "x": 0, "y": 0, "z": 0 }, "orient": { "type": "Float64Array", "length": 9, "values": [ 0.788073, -0.548562, -0.279322, 0.597228, 0.79131, 0.130947, 0.149198, -0.270014, 0.951227 ] }, "inPlay": true, "pocket": null }, { "id": 14, "group": "stripe", "p": { "x": 0.036648, "y": 0.152676 }, "v": { "x": 0, "y": 0 }, "w": { "x": 0, "y": 0, "z": 0 }, "orient": { "type": "Float64Array", "length": 9, "values": [ -0.198794, -0.755209, -0.624612, -0.980029, 0.15004, 0.1305, -0.004837, 0.63808, -0.769955 ] }, "inPlay": true, "pocket": null }, { "id": 15, "group": "stripe", "p": { "x": 0.248021, "y": -0.254059 }, "v": { "x": 0, "y": 0 }, "w": { "x": 0, "y": 0, "z": 0 }, "orient": { "type": "Float64Array", "length": 9, "values": [ 0.762109, 0.527498, -0.375414, 0.327936, 0.185461, 0.926317, 0.558255, -0.829066, -0.031644 ] }, "inPlay": true, "pocket": null } ], "serverState": { "matchId": "RyoP85XrqfX2", "sequence": 6, "serverTime": 0, "status": "playing", "phase": "open", "turn": 0, "players": [ { "slot": 0, "name": "Sa2ḿmurai", "avatar": "https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128", "connected": true, "ready": true, "group": null, "onEight": false, "remaining": [], "stats": { "shots": 2, "potted": 2, "fouls": 1, "bestRun": 2 } }, { "slot": 1, "name": "𝓎𝒶𝓈𝑜_ ᵉˢᵗ", "avatar": "https://cdn.discordapp.com/avatars/1254868628675760209/a_ffb8ce7ed63fb5813f769bcffb5a9609.png?size=128", "connected": false, "ready": true, "group": null, "onEight": false, "remaining": [], "stats": { "shots": 0, "potted": 0, "fouls": 0, "bestRun": 0 } } ], "balls": [ { "id": 0, "x": -0.4953, "y": 0, "inPlay": true, "pocket": null }, { "id": 1, "x": -0.039226, "y": -0.278441, "inPlay": true, "pocket": null }, { "id": 2, "x": 1.021465, "y": -0.526165, "inPlay": false, "pocket": "topRight" }, { "id": 3, "x": 0.123323, "y": 0.381355, "inPlay": true, "pocket": null }, { "id": 4, "x": 0.616993, "y": 0.204055, "inPlay": true, "pocket": null }, { "id": 5, "x": 0.251337, "y": 0.360561, "inPlay": true, "pocket": null }, { "id": 6, "x": 0.116962, "y": 0.249824, "inPlay": true, "pocket": null }, { "id": 7, "x": -1.021465, "y": -0.526165, "inPlay": false, "pocket": "topLeft" }, { "id": 8, "x": 0.20002, "y": 0.457782, "inPlay": true, "pocket": null }, { "id": 9, "x": -0.872744, "y": -0.057685, "inPlay": true, "pocket": null }, { "id": 10, "x": -0.184468, "y": 0.139737, "inPlay": true, "pocket": null }, { "id": 11, "x": 0.356587, "y": 0.42555, "inPlay": true, "pocket": null }, { "id": 12, "x": 0.659868, "y": 0.458733, "inPlay": true, "pocket": null }, { "id": 13, "x": 0.184987, "y": 0.364461, "inPlay": true, "pocket": null }, { "id": 14, "x": 0.036648, "y": 0.152676, "inPlay": true, "pocket": null }, { "id": 15, "x": 0.248021, "y": -0.254059, "inPlay": true, "pocket": null } ], "ballInHand": true, "behindHeadString": false, "cuePlaced": false, "winner": null, "winKind": null, "rackNumber": 1, "busyForMs": 0, "potted": [ 2, 7 ] }, "latestState": { "matchId": "RyoP85XrqfX2", "sequence": 6, "serverTime": 0, "status": "playing", "phase": "open", "turn": 0, "players": [ { "slot": 0, "name": "Sa2ḿmurai", "avatar": "https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128", "connected": true, "ready": true, "group": null, "onEight": false, "remaining": [], "stats": { "shots": 2, "potted": 2, "fouls": 1, "bestRun": 2 } }, { "slot": 1, "name": "𝓎𝒶𝓈𝑜_ ᵉˢᵗ", "avatar": "https://cdn.discordapp.com/avatars/1254868628675760209/a_ffb8ce7ed63fb5813f769bcffb5a9609.png?size=128", "connected": false, "ready": true, "group": null, "onEight": false, "remaining": [], "stats": { "shots": 0, "potted": 0, "fouls": 0, "bestRun": 0 } } ], "balls": [ { "id": 0, "x": -0.4953, "y": 0, "inPlay": true, "pocket": null }, { "id": 1, "x": -0.039226, "y": -0.278441, "inPlay": true, "pocket": null }, { "id": 2, "x": 1.021465, "y": -0.526165, "inPlay": false, "pocket": "topRight" }, { "id": 3, "x": 0.123323, "y": 0.381355, "inPlay": true, "pocket": null }, { "id": 4, "x": 0.616993, "y": 0.204055, "inPlay": true, "pocket": null }, { "id": 5, "x": 0.251337, "y": 0.360561, "inPlay": true, "pocket": null }, { "id": 6, "x": 0.116962, "y": 0.249824, "inPlay": true, "pocket": null }, { "id": 7, "x": -1.021465, "y": -0.526165, "inPlay": false, "pocket": "topLeft" }, { "id": 8, "x": 0.20002, "y": 0.457782, "inPlay": true, "pocket": null }, { "id": 9, "x": -0.872744, "y": -0.057685, "inPlay": true, "pocket": null }, { "id": 10, "x": -0.184468, "y": 0.139737, "inPlay": true, "pocket": null }, { "id": 11, "x": 0.356587, "y": 0.42555, "inPlay": true, "pocket": null }, { "id": 12, "x": 0.659868, "y": 0.458733, "inPlay": true, "pocket": null }, { "id": 13, "x": 0.184987, "y": 0.364461, "inPlay": true, "pocket": null }, { "id": 14, "x": 0.036648, "y": 0.152676, "inPlay": true, "pocket": null }, { "id": 15, "x": 0.248021, "y": -0.254059, "inPlay": true, "pocket": null } ], "ballInHand": true, "behindHeadString": false, "cuePlaced": false, "winner": null, "winKind": null, "rackNumber": 1, "busyForMs": 0, "potted": [ 2, 7 ] }, "netState": { "matchId": "RyoP85XrqfX2", "sequence": 6, "serverTime": 0, "status": "playing", "phase": "open", "turn": 0, "players": [ { "slot": 0, "name": "Sa2ḿmurai", "avatar": "https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128", "connected": true, "ready": true, "group": null, "onEight": false, "remaining": [], "stats": { "shots": 2, "potted": 2, "fouls": 1, "bestRun": 2 } }, { "slot": 1, "name": "𝓎𝒶𝓈𝑜_ ᵉˢᵗ", "avatar": "https://cdn.discordapp.com/avatars/1254868628675760209/a_ffb8ce7ed63fb5813f769bcffb5a9609.png?size=128", "connected": false, "ready": true, "group": null, "onEight": false, "remaining": [], "stats": { "shots": 0, "potted": 0, "fouls": 0, "bestRun": 0 } } ], "balls": [ { "id": 0, "x": -0.4953, "y": 0, "inPlay": true, "pocket": null }, { "id": 1, "x": -0.039226, "y": -0.278441, "inPlay": true, "pocket": null }, { "id": 2, "x": 1.021465, "y": -0.526165, "inPlay": false, "pocket": "topRight" }, { "id": 3, "x": 0.123323, "y": 0.381355, "inPlay": true, "pocket": null }, { "id": 4, "x": 0.616993, "y": 0.204055, "inPlay": true, "pocket": null }, { "id": 5, "x": 0.251337, "y": 0.360561, "inPlay": true, "pocket": null }, { "id": 6, "x": 0.116962, "y": 0.249824, "inPlay": true, "pocket": null }, { "id": 7, "x": -1.021465, "y": -0.526165, "inPlay": false, "pocket": "topLeft" }, { "id": 8, "x": 0.20002, "y": 0.457782, "inPlay": true, "pocket": null }, { "id": 9, "x": -0.872744, "y": -0.057685, "inPlay": true, "pocket": null }, { "id": 10, "x": -0.184468, "y": 0.139737, "inPlay": true, "pocket": null }, { "id": 11, "x": 0.356587, "y": 0.42555, "inPlay": true, "pocket": null }, { "id": 12, "x": 0.659868, "y": 0.458733, "inPlay": true, "pocket": null }, { "id": 13, "x": 0.184987, "y": 0.364461, "inPlay": true, "pocket": null }, { "id": 14, "x": 0.036648, "y": 0.152676, "inPlay": true, "pocket": null }, { "id": 15, "x": 0.248021, "y": -0.254059, "inPlay": true, "pocket": null } ], "ballInHand": true, "behindHeadString": false, "cuePlaced": false, "winner": null, "winKind": null, "rackNumber": 1, "busyForMs": 0, "potted": [ 2, 7 ] }, "view": { "ownKeys": [ "balls", "orthoCounter" ], "constructor": "tL", "orthoCounter": 19988 }, "renderer": { "ownKeys": [ "canvas", "effects", "ctx", "sprite", "scale", "originX", "originY", "dpr", "cssW", "cssH", "rotated", "drops", "lastFrame", "spriteTable", "theme" ], "constructor": "tM", "scale": 305.17807, "originX": 408.012909, "originY": 193.269272, "dpr": 1.21875, "cssW": 816.025818, "cssH": 386.538544, "rotated": false, "sprite": { "x": -1.1286, "y": -0.6333, "w": 2.2572, "h": 1.2666 }, "spriteTable": "classic", "canvasBitmap": [ 995, 471 ], "canvasRect": { "x": 23.987185, "y": 85.987198, "width": 816.025818, "height": 386.538544 } }, "player": { "tracks": [], "events": [], "eventCursor": 0, "time": -1, "duration": 0 }, "net": { "handlers": { "session": { "type": "Set", "size": 0, "values": [] }, "connection": { "type": "Set", "size": 1, "values": [ "[Function anonymous]" ] }, "state": { "type": "Set", "size": 1, "values": [ "[Function anonymous]" ] }, "started": { "type": "Set", "size": 1, "values": [ "[Function anonymous]" ] }, "physics": { "type": "Set", "size": 1, "values": [ "[Function anonymous]" ] }, "finished": { "type": "Set", "size": 1, "values": [ "[Function anonymous]" ] }, "opponentJoined": { "type": "Set", "size": 1, "values": [ "[Function anonymous]" ] }, "opponentLeft": { "type": "Set", "size": 1, "values": [ "[Function anonymous]" ] }, "opponentBack": { "type": "Set", "size": 1, "values": [ "[Function anonymous]" ] }, "opponentAim": { "type": "Set", "size": 1, "values": [ "[Function anonymous]" ] }, "gameStarted": { "type": "Set", "size": 1, "values": [ "[Function anonymous]" ] }, "error": { "type": "Set", "size": 1, "values": [ "[Function anonymous]" ] } }, "slot": 0, "code": null, "connection": "online", "state": { "matchId": "RyoP85XrqfX2", "sequence": 6, "serverTime": 0, "status": "playing", "phase": "open", "turn": 0, "players": [ { "slot": 0, "name": "Sa2ḿmurai", "avatar": "https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128", "connected": true, "ready": true, "group": null, "onEight": false, "remaining": [], "stats": { "shots": 2, "potted": 2, "fouls": 1, "bestRun": 2 } }, { "slot": 1, "name": "𝓎𝒶𝓈𝑜_ ᵉˢᵗ", "avatar": "https://cdn.discordapp.com/avatars/1254868628675760209/a_ffb8ce7ed63fb5813f769bcffb5a9609.png?size=128", "connected": false, "ready": true, "group": null, "onEight": false, "remaining": [], "stats": { "shots": 0, "potted": 0, "fouls": 0, "bestRun": 0 } } ], "balls": [ { "id": 0, "x": -0.4953, "y": 0, "inPlay": true, "pocket": null }, { "id": 1, "x": -0.039226, "y": -0.278441, "inPlay": true, "pocket": null }, { "id": 2, "x": 1.021465, "y": -0.526165, "inPlay": false, "pocket": "topRight" }, { "id": 3, "x": 0.123323, "y": 0.381355, "inPlay": true, "pocket": null }, { "id": 4, "x": 0.616993, "y": 0.204055, "inPlay": true, "pocket": null }, { "id": 5, "x": 0.251337, "y": 0.360561, "inPlay": true, "pocket": null }, { "id": 6, "x": 0.116962, "y": 0.249824, "inPlay": true, "pocket": null }, { "id": 7, "x": -1.021465, "y": -0.526165, "inPlay": false, "pocket": "topLeft" }, { "id": 8, "x": 0.20002, "y": 0.457782, "inPlay": true, "pocket": null }, { "id": 9, "x": -0.872744, "y": -0.057685, "inPlay": true, "pocket": null }, { "id": 10, "x": -0.184468, "y": 0.139737, "inPlay": true, "pocket": null }, { "id": 11, "x": 0.356587, "y": 0.42555, "inPlay": true, "pocket": null }, { "id": 12, "x": 0.659868, "y": 0.458733, "inPlay": true, "pocket": null }, { "id": 13, "x": 0.184987, "y": 0.364461, "inPlay": true, "pocket": null }, { "id": 14, "x": 0.036648, "y": 0.152676, "inPlay": true, "pocket": null }, { "id": 15, "x": 0.248021, "y": -0.254059, "inPlay": true, "pocket": null } ], "ballInHand": true, "behindHeadString": false, "cuePlaced": false, "winner": null, "winKind": null, "rackNumber": 1, "busyForMs": 0, "potted": [ 2, 7 ] }, "latest": { "matchId": "RyoP85XrqfX2", "sequence": 6, "serverTime": 0, "status": "playing", "phase": "open", "turn": 0, "players": [ { "slot": 0, "name": "Sa2ḿmurai", "avatar": "https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128", "connected": true, "ready": true, "group": null, "onEight": false, "remaining": [], "stats": { "shots": 2, "potted": 2, "fouls": 1, "bestRun": 2 } }, { "slot": 1, "name": "𝓎𝒶𝓈𝑜_ ᵉˢᵗ", "avatar": "https://cdn.discordapp.com/avatars/1254868628675760209/a_ffb8ce7ed63fb5813f769bcffb5a9609.png?size=128", "connected": false, "ready": true, "group": null, "onEight": false, "remaining": [], "stats": { "shots": 0, "potted": 0, "fouls": 0, "bestRun": 0 } } ], "balls": [ { "id": 0, "x": -0.4953, "y": 0, "inPlay": true, "pocket": null }, { "id": 1, "x": -0.039226, "y": -0.278441, "inPlay": true, "pocket": null }, { "id": 2, "x": 1.021465, "y": -0.526165, "inPlay": false, "pocket": "topRight" }, { "id": 3, "x": 0.123323, "y": 0.381355, "inPlay": true, "pocket": null }, { "id": 4, "x": 0.616993, "y": 0.204055, "inPlay": true, "pocket": null }, { "id": 5, "x": 0.251337, "y": 0.360561, "inPlay": true, "pocket": null }, { "id": 6, "x": 0.116962, "y": 0.249824, "inPlay": true, "pocket": null }, { "id": 7, "x": -1.021465, "y": -0.526165, "inPlay": false, "pocket": "topLeft" }, { "id": 8, "x": 0.20002, "y": 0.457782, "inPlay": true, "pocket": null }, { "id": 9, "x": -0.872744, "y": -0.057685, "inPlay": true, "pocket": null }, { "id": 10, "x": -0.184468, "y": 0.139737, "inPlay": true, "pocket": null }, { "id": 11, "x": 0.356587, "y": 0.42555, "inPlay": true, "pocket": null }, { "id": 12, "x": 0.659868, "y": 0.458733, "inPlay": true, "pocket": null }, { "id": 13, "x": 0.184987, "y": 0.364461, "inPlay": true, "pocket": null }, { "id": 14, "x": 0.036648, "y": 0.152676, "inPlay": true, "pocket": null }, { "id": 15, "x": 0.248021, "y": -0.254059, "inPlay": true, "pocket": null } ], "ballInHand": true, "behindHeadString": false, "cuePlaced": false, "winner": null, "winKind": null, "rackNumber": 1, "busyForMs": 0, "potted": [ 2, 7 ] }, "view": { "status": "active", "matchId": "RyoP85XrqfX2", "hosted": false, "sequence": 6, "phase": "open", "turn": 0, "players": [ { "slot": 0, "name": "Sa2ḿmurai", "avatar": "https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128", "userId": "690943650775040050", "cue": "classic", "connected": false, "ready": true, "group": null, "onEight": false, "remaining": [], "stats": { "shots": 2, "potted": 2, "fouls": 1, "bestRun": 2 } }, { "slot": 1, "name": "𝓎𝒶𝓈𝑜_ ᵉˢᵗ", "avatar": "https://cdn.discordapp.com/avatars/1254868628675760209/a_ffb8ce7ed63fb5813f769bcffb5a9609.png?size=128", "userId": "1254868628675760209", "cue": "classic", "connected": false, "ready": true, "group": null, "onEight": false, "remaining": [], "stats": { "shots": 0, "potted": 0, "fouls": 0, "bestRun": 0 } } ], "balls": [ { "id": 0, "x": -0.4953, "y": 0, "inPlay": true, "pocket": null }, { "id": 1, "x": -0.039226, "y": -0.278441, "inPlay": true, "pocket": null }, { "id": 2, "x": 1.021465, "y": -0.526165, "inPlay": false, "pocket": "topRight" }, { "id": 3, "x": 0.123323, "y": 0.381355, "inPlay": true, "pocket": null }, { "id": 4, "x": 0.616993, "y": 0.204055, "inPlay": true, "pocket": null }, { "id": 5, "x": 0.251337, "y": 0.360561, "inPlay": true, "pocket": null }, { "id": 6, "x": 0.116962, "y": 0.249824, "inPlay": true, "pocket": null }, { "id": 7, "x": -1.021465, "y": -0.526165, "inPlay": false, "pocket": "topLeft" }, { "id": 8, "x": 0.20002, "y": 0.457782, "inPlay": true, "pocket": null }, { "id": 9, "x": -0.872744, "y": -0.057685, "inPlay": true, "pocket": null }, { "id": 10, "x": -0.184468, "y": 0.139737, "inPlay": true, "pocket": null }, { "id": 11, "x": 0.356587, "y": 0.42555, "inPlay": true, "pocket": null }, { "id": 12, "x": 0.659868, "y": 0.458733, "inPlay": true, "pocket": null }, { "id": 13, "x": 0.184987, "y": 0.364461, "inPlay": true, "pocket": null }, { "id": 14, "x": 0.036648, "y": 0.152676, "inPlay": true, "pocket": null }, { "id": 15, "x": 0.248021, "y": -0.254059, "inPlay": true, "pocket": null } ], "potted": [ 2, 7 ], "ballInHand": true, "behindHeadString": false, "cuePlaced": false, "winner": null, "winKind": null, "tournament": null, "rackNumber": 1, "busyForMs": 0, "turnRemainingMs": 60000, "turnTotalMs": 60000, "warmupRemainingMs": null, "arrived": [ true, false ], "lastShot": null, "rematch": { "you": false, "them": false, "declined": false }, "you": 0, "table": { "id": "classic", "host": "classic", "mine": false }, "wallet": { "coins": 1085, "cues": [ "classic" ], "owned": [ "classic" ], "tables": [ "classic" ], "cue": "classic", "table": "classic", "myTable": false }, "developer": false }, "send": "[Function anonymous]", "closer": "[Function anonymous]", "lastShotKey": "", "lastStateKey": "{\"matchId\":\"RyoP85XrqfX2\",\"sequence\":6,\"serverTime\":0,\"status\":\"playing\",\"phase\":\"open\",\"turn\":0,\"players\":[{\"slot\":0,\"name\":\"Sa2ḿmurai\",\"avatar\":\"https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128\",\"connected\":true,\"ready\":true,\"group\":null,\"onEight\":false,\"remaining\":[],\"stats\":{\"shots\":2,\"potted\":2,\"fouls\":1,\"bestRun\":2}},{\"slot\":1,\"name\":\"𝓎𝒶𝓈...", "opponentWasConnected": false, "opponentEverHere": false, "request": "[Function request]", "rtt": 306.708129, "rttVar": 4.614263 } } } }