AMG UI 标准 v2 · AMG UI STANDARD v2(深棕玻璃)
STANDARD.md · latest.json · pieces/ · CHANGELOG.md
本版取代 2026-10-20 v3;唯一来源=线上深棕玻璃原件(零件取线上原件,附来源与 SHA,不重画、不 AI 生成)。
正本存放位置:(internal)(NAS 正本;工作副本(internal))。版本固定 v2 一个正本。
Supersedes the 2026-10-20 v3. Single source = the live dark-brown glass originals. No piece is redrawn or AI-generated.
配套:PIECES.csv(零件清单+SHA256)· pieces/(原档)· AMG-UI-STANDARD-v2.pdf(同内容,一页一表)· DIFF-TO-ADOPT.md(5 款换件)· check-conformance(只读检查脚本)。
验收规则 Acceptance rule(Victor 2026-10-23)
改完后每款游戏的每个标准零件必须与 PIECES.csv 的 SHA256 完全相同(逐档比对,不是目视);以后每次改动都跑 ./check-conformance。细节见本文件第 23 节与下文。
P1 · 封面 · 元信息 · Cover · metadata ALL
| 项目 Item | 规格 Spec(量的,390×844 DPR3 headless Chromium,除注明) | 状态 / 来源 Status · Source |
|---|---|---|
| 文件 File | AMG-UI-STANDARD v2(固定一个正本)· 2026-10-23 · hq-designer | 本版取代 2026-10-20 v3;唯一来源=线上深棕玻璃原件。v3 只供对照,不取其任何件。 |
| 正本存放位置 Canonical location | (internal)(NAS 正本;工作副本 (internal)) | 改标准 = 改 PIECES.csv + STANDARD.md + 本 PDF,版本号永远是 v2;任何改动都要先问 Victor。 |
| 唯一来源 Single source | 线上深棕玻璃:chicken=kancilroad、croc=komodo、wheel、tower(四款已核最接近);fishshoot 属统一目标,房内 UI 未核实 | Victor 2026-10-23 12:4x 拍板:AMG 唯一标准=深棕玻璃;plinko/catfish/crash/赛马/赛车都改成它。 |
| 来源核实基点 Verified base | 源码包 amg-minigames-src-20261019.zip(sha256 0808135d…)· git main@67df3c9;线上 8 站 225 个文件 2026-10-23 重取,SHA 与盘点 CSV 0 差(量的);线上构建戳(meta mg-build,今日复核未变):chicken 20261018-081812 · croc -081818 · wheel -081823 · tower -081835 · plinko -081829 · catfish -081840 · crash 20261016-222106 | 源码件仅在 SHA256 与线上一致时取用;25/25 图/字件一致(量的)。 |
| 零件 Pieces | 图/字 25 件(取到,SHA=线上)· 代码件 14(DOM/CSS/SVG,保留原实现+引用,不重制 PNG)· 缺/未定/未核实/不取 7 项 | 明细见 PIECES.csv(46 行)。线上没有的件列「缺」,不补画、不 AI 生成。 |
| 裁决规则 Decision rule | 线上四款有差异处:取最多款版本;原并列/各异的「未定」项由总监 #1650(2026-10-23)一律取 wheel 实测值(见第 19 页) | 另发现盘点没列的差异(玻璃透明度、阴影、按下态、底部留白)一并按同规则列出。 |
| 标准视口 Viewports | 手机 390×844、430×932(DPR3,本版实拍);横屏 844×390(DPR3,本版实拍);折叠 1812×2176 / iPad 直立 1024×1366 / 桌面 1920×1080:本版未重拍,旧盘点截图为 DPR1,不冒称符合家规;顶栏钮边长按 fit.ts 公式 clamp(44,72,min(vw,vh)×0.11) 推得:折叠/iPad/桌面=72、430 宽=47.3(推的,未实拍) | 直立/横屏是同一套零件的两种摆法(第 20、21 页),不是两套。 |
| 证据目录 Evidence | shots/<款>/(线上实机截图 + dump JSON)· _live/ + refetch-live-sha.csv(今日重取的线上字节与 SHA)· measure/(conformance / compare / decisions JSON)· sbs/(并排图)· layout/(摆法图)· tools/(可重跑脚本) | 全部只读 GET 取得;无头浏览器一次一个 |
| 怎么用 How to use | 要某个零件:PIECES.csv 找 id → file 列取原档(live_sha256 为准);DOM 件按 implementation_ref 取原实现;验收跑 ./check-conformance | 一页一表,中英对照;截图均为线上实机(headless),不是画的。 |
每页左为线上实机截图(DPR3),右为 1 张表。色值/尺寸/字号均为 getBoundingClientRect/getComputedStyle 量测;croc、tower 的 DOM 在 828 宽设计舞台里再缩放 0.471 到 390,表内已换算成显示值(推的:computed×0.471)。
P2 · 色彩令牌 · 字体 · Colour tokens · fonts TOKENS · FONT-*


| 项目 Item | 规格 Spec(量的,390×844 DPR3 headless Chromium,除注明) | 状态 / 来源 Status · Source |
|---|---|---|
| 金 Gold | --gold #ffd24a(4/4 款同) | 图标/余额/选中边/强调;对比度 金/玻璃 8.4–13.4:1(量的:黑底~白底两端) |
| 玻璃面 Glass | --glass1 rgba(40,30,18,.9) → --glass2 rgba(20,15,10,.9);取 croc=wheel(2/4);chicken .88/.92、tower .92/.92 与多数不同 | 线上 :root 实测;FRAG-TOKENS 检查 |
| 描边线 Line | --line rgba(255,200,80,.45)(chicken、croc、wheel 3/4);tower .5 | 取 .45 |
| 顶栏钮底 Top-bar btn | linear-gradient(rgba(40,30,18,.9), rgba(20,15,10,.94));1px solid rgba(255,200,80,.5);圆角 9.68px(4/4 款同) | 线上 computed |
| 文字色 Text | 名 rgba(255,220,150,.85)(croc=wheel,取);余额 #ffd24a;白 #fff;面板标题 #f1dfae;按钮墨 #3a2605;错误红 #e14b4b / 浅 #ffb4b4 | 对比度见各页 |
| 字体 Fonts | Playfair Lining 800(sha 31337251)= --fn 倍率牌;Space Grotesk 可变(sha acad6de1)= 载入页文字 700;按钮/标签正文 "Segoe UI",Arial,Helvetica,sans-serif(系统字回落,各平台观感不同) | 字体档已入 pieces/fonts/;正文实际 font-family 以实测为准,不以附字体档代替 |
| 页面底 Page bg | body/#app #060a18;舞台 #080b16 | 线上 CSS |
| 阴影 Shadow | .glass CSS 写法:croc=wheel 0 2px 10px #00000080(取,FRAG-GLASS 检查此写法);chicken 0 4px 18px #00000073。显示值因舞台缩放(croc/tower ×0.471)四款各异 |
CSS 写法取 croc=wheel;显示值取 wheel 的 0 2px 10px #00000080(总监 #1650 定 2026-10-23) |
以上令牌是「线上多数版」,不是我新定;chicken(.88/.92)与 tower(.92/.5)要改到多数版才能「一模一样」(见 DIFF 与第 19 页)。
P3 · 顶栏 · 主页钮 Home · Top bar · Home TB-HOME


| 项目 Item | 规格 Spec(量的,390×844 DPR3 headless Chromium,除注明) | 状态 / 来源 Status · Source |
|---|---|---|
| 位置/尺寸 Pos/size | x12 y12 · 44×44 css px(4/4 款同,量的) | 线上 getBoundingClientRect |
| 底/边/角 Skin | linear-gradient(rgba(40,30,18,.9), rgba(20,15,10,.94));1px solid rgba(255,200,80,.5);圆角 9.68;阴影 rgba(0,0,0,.45) 0 4px 18px(4/4 款同) | 4/4 款同(量的) |
| 图标 Icon | 内联 SVG 24×24,viewBox 0 0 24 24,stroke currentColor 2.2,round;path「M3 11.5 12 4l9 7.5」「M5.5 10v9.5h13V10」「M10 19.5v-5h4v5」;色 #ffd24a | 线上无 PNG;SVG 串 7/7 款线上相同(FRAG-SVG-HOME-1..3) |
| 文字 Text | 无字;aria-label=Home;.ib 基础 font 800 22px(显示) | shell.ts:38 |
| 间距 Spacing | 距屏左 12、屏顶 12;与余额胶囊间隔 8(56→64) | 推的:56+8=64 |
| 按下 Pressed | :active{filter:brightness(1.35); box-shadow:0 1px 6px rgba(0,0,0,.6) inset}(fit.ts HOME_CSS,四款同;实测 mousedown 吻合,截图见左) | 量的+源码 |
| 规则源 Rule source | fit.ts HOME_CSS(sharedHudCss;运行时注入、!important;8 款 bundle 都带同一份):边长 side=clamp(44,72,min(vw,vh)×0.11) css(390 宽→44、430→47.3;折叠/iPad/桌面→72,推的:公式算);margin 12 · gap 8;圆角=side×.22;字 800 side×.5;svg 55%;z-index 30;transition filter .08s;右上从右往左 记录(1.5×side 宽)→声音→(全屏)→i | graphic-amg/skin/src/fit.ts:105-118(hudSlots / homeCssSpec / HOME_CSS) |
| 禁用/隐藏 Disabled | 无禁用态;宿主不可退出时 display:none(platform.nav.canExit=false) | shell.ts render() |
| 触控 Hit | 热区扩到 ≥44×44 css(.ib::after,--hit) | style.css |
| 来源 Source | graphic-amg/shell/src/shell.ts:38 + style.css(.ib/.glass);线上 CSS https://amg-kancilroad.pages.dev/assets/index-Bk4cNRm-.css | 代码件,保留原实现 |
P4 · 顶栏 · 说明钮 Info (i) · Top bar · Info (i) TB-INFO


| 项目 Item | 规格 Spec(量的,390×844 DPR3 headless Chromium,除注明) | 状态 / 来源 Status · Source |
|---|---|---|
| 位置/尺寸 Pos/size | x208 y12 · 44×44 css px(4/4 款同,量的) | 线上 getBoundingClientRect |
| 底/边/角 Skin | 同 Home(第 3 页) | 4/4 款同 |
| 文字 Text | 字母「i」,font 800 22px,#ffd24a;无 SVG | shell.ts:39 |
| 行为 Behaviour | 点开说明弹窗(第 13 页);弹窗面板从 y≈85 起,不盖住顶栏,四钮仍可见(线上截图 panel-info-m390.png);暗幕盖满视口 | 线上实拍 |
| 按下/禁用 States | :active{filter:brightness(1.35);box-shadow:0 1px 6px rgba(0,0,0,.6) inset}(同 Home,共用 fit.ts);无禁用态 | 量的+源码 |
| 位置规则 Slot rule | 右上从右往左排:记录 → 声音 →(全屏)→ i,钮间 gap 8,右缘距屏 12;i 的 x=屏宽−12−(1.5+1+1)×side−2×8(390 宽:390−12−154−16=208) | 推的(fit.ts hudSlots 公式),与实测 x208 吻合 |
| 触控 Hit | 同 Home | |
| 来源 Source | shell.ts:39;线上 CSS https://amg-kancilroad.pages.dev/assets/index-Bk4cNRm-.css | 代码件 |
P5 · 顶栏 · 声音钮 Sound(开 / 静音) · Top bar · Sound (on / muted) TB-SOUND


| 项目 Item | 规格 Spec(量的,390×844 DPR3 headless Chromium,除注明) | 状态 / 来源 Status · Source |
|---|---|---|
| 位置/尺寸 Pos/size | x260 y12 · 44×44 css px(4/4 款同,量的) | 线上 getBoundingClientRect |
| 底/边/角 Skin | 同 Home | 4/4 款同 |
| 图标 Icon | 开:24×24 SVG 喇叭「M4 9.5v5h3.5L12 18.5v-13L7.5 9.5z」fill #fff + 声波「M16 9a4 4 0 010 6M18.5 6.5a8 8 0 010 11」stroke #fff 2.4;静音:喇叭 + 斜线「M3.5 3.5l17 17」stroke #ff6b5a | ui-logic.ts:14 soundIconSvg();7/7 款线上字串相同 |
| 对比度 Contrast | 白图标/玻璃 12.1–19.3:1;静音红斜线 #ff6b5a/玻璃 6.05:1(黑底)~4.35:1(白底最坏) | 量的(按玻璃合成色算;亮底最坏 4.35 略低于 AA 4.5,图标非正文) |
| 状态 States | on / muted 两态,点按切换;无禁用态 | 线上实拍(点 #snd 后截) |
| 来源 Source | graphic-amg/skin/src/ui-logic.ts:14;shell.ts:39 | 代码件 |
P6 · 顶栏 · 记录钮 History(时钟 + 徽标) · Top bar · History (clock + badge) TB-HIST · FSBTN



| 项目 Item | 规格 Spec(量的,390×844 DPR3 headless Chromium,除注明) | 状态 / 来源 Status · Source |
|---|---|---|
| 位置/尺寸 Pos/size | x312 y12 · 66×44 css px(4/4 款同,量的) | 线上 getBoundingClientRect |
| 底/边/角 Skin | 同 Home | 4/4 款同 |
| 图标 Icon | 时钟 SVG 22×22,viewBox 24,stroke #fff 2.4 round:circle(12,13,r8)+「M12 8v5l3 2」 | 6/7 款线上有(crash 没有记录钮) |
| 徽标 Badge | 金底圆 #ffd24a,字 #2a1b06 800,字号 56px×transform scale(--bdk)(故 computed 为 56px,显示≈13px 目视);显示盒 22×22,位置 x345.9 y23;内容=最近记录条数 | 4/4 款同(量的);样式在 fit.ts HOME_CSS 的 .hs .bd |
| 全屏钮 Fullscreen | 源码有共用模块(common/fullscreen/src/mount.ts):安卓/iPad 显示 HUD 钮,窄竖屏放第二行、右缘齐历史钮;iPhone Safari 不显示改收栏 | 线上 Android UA(390×844 DPR3,无头)实测渲染:x334 y64 · 44×44 · 同顶栏钮皮(渐变 .9/.94、1px rgba(255,200,80,.5)、圆角 9.68、金 #ffd24a),在第二行、右缘齐记录钮(量的,截图见左);iPhone 不显示;path 串 7/7 款线上都带 |
| 来源 Source | shell.ts:40 + graphic-amg/skin/src/fit.ts:105-118(共用 HOME_CSS);style.css .ib .bd(被 fit.ts 覆盖) | 代码件 |
P7 · 余额胶囊 Balance capsule · Balance capsule (DEMO / name + balance) BAL




| 项目 Item | 规格 Spec(量的,390×844 DPR3 headless Chromium,除注明) | 状态 / 来源 Status · Source |
|---|---|---|
| 位置 Pos | x64 y12(4/4 款同) | 量的 |
| 尺寸 Size(宽×高) | chicken 140×48 · croc 136.6×50.4 · wheel 140×56 · tower 141.3×50.9 | 取 140×56(wheel 实测,总监 #1650 定 2026-10-23);chicken/croc/tower 要改 |
| 底/边 Skin | 玻璃渐变(令牌 .9/.9,第 2 页);边 1px rgba(255,200,80,.45);显示边宽:chicken 1 · wheel 1 · croc 0.47 · tower 0.94(推的:×0.471) | 边宽取 1px(chicken、wheel 2/4) |
| 圆角 Radius | 显示值:chicken 10 · wheel 10 · croc 4.7 · tower 6.6(推的:croc CSS 10px、tower 14px ×0.471) | 取 10px(2/4);croc/tower 偏小 |
| 阴影 Shadow | 显示值各异:chicken 0 4 18 .45 · wheel 0 2 10 .5 · croc≈0 .9 4.7 · tower≈0 1.4 5.7(推的) | 取 0 2px 10px #00000080(wheel 实测,总监 #1650 定 2026-10-23);croc/tower 的显示值已被舞台缩放缩小,要按 wheel 值出 |
| 名字行 Name | 12.05px/600:chicken #f1dfae · croc=wheel rgba(255,220,150,.85) · tower 12.25px/700 rgba(255,226,160,.92) | 取 croc=wheel(2/4):12.05/600 rgba(255,220,150,.85) |
| 余额数 Value | 800 · #ffd24a:chicken 16.0px · tower 16.0px · croc 14.1px · wheel 20.0px;千分位点 | 取 20px/800(wheel 实测,总监 #1650 定 2026-10-23(r2:一律取 wheel));chicken/croc/tower 要改 |
| 内边距 Padding | 名字行 x79(距胶囊左 15)、y21;数值行 y35(chicken);其余款以截图为准 | 量的(chicken) |
| 对比度 Contrast | 余额金/玻璃 8.4–13.4:1;名字 rgba(255,220,150,.85)/玻璃 7.1–10.7:1 | 量的(玻璃合成色) |
| 状态 States | 无按下/禁用态(纯显示);名字=宿主 userName,宿主不给时 PLAYER;未取到余额显示「—」 | shell.ts render() |
| 来源 Source | shell.ts:38 (.userbox.glass);style.css .userbox;线上 CSS https://amg-kancilroad.pages.dev/assets/index-Bk4cNRm-.css | 代码件 |
P8 · 筹码 1K–500K + 选中环 · Chips 1K–500K + selected ring HUD-CHIP-* · HUD-RING · CHIPROW




| 项目 Item | 规格 Spec(量的,390×844 DPR3 headless Chromium,除注明) | 状态 / 来源 Status · Source |
|---|---|---|
| 面值/色序 Face/colour | 1K 蓝 imgCoins1(a894815d)· 5K 绿(339aaef0)· 10K 青(fce4f3e4)· 50K 紫(49d5efc1)· 100K 红(1d22cb81)· 500K 灰(8679e0d0) | 6 图字节各异(盘点「6 个全同」是指 5 款用同一批,不是筹码互同);5 款线上同档 |
| 原图 px Source px | 178×186 · 179×189 · 178×186 · 178×188 · 180×188 · 178×188(原图像素,≠显示) | 量的(PIL) |
| 显示尺寸 Display | 常态 48×50.7;选中 52.8×55.2(scale 1.1);tower 常态 48×48 | 取 48×50.7(chicken、croc、wheel 3/4) |
| 间距 Pitch | 中心距:chicken 53.0 · croc 52.7 · wheel 52.0 · tower 52.7 | 取 52.7(croc=tower 2/4) |
| 面值字 Label | DOM ,居中叠在筹码上;font 800 12.05px,色 #fff(croc、wheel、tower);chicken rgba(255,255,255,.78);tower 字重 700 | 取 800/#fff(2~3/4)。面值=请求 bet=扣款,K/M 允许(Victor 10-10) |
| 选中 Selected | scale(1.1) + imgHighlight 环(241×241 px)盒 inset −8px,3s linear 无限自转;选中钮 z 在上 | 源码 CSS 实读;线上截图见左(chicken 1K) |
| 禁用 Disabled | .cdis:img grayscale(1) brightness(.55)、字 opacity .55;整列局中变淡 .chips.off:opacity chicken .5 · croc .45 · wheel .45 · tower 另用 grayscale(1) brightness(.6) opacity .8 | 取 .45(croc=wheel 2/4);500K 在 demo 下为 cdis(实拍) |
| 币径公式 Diameter | coinDiameterDesign:竖屏 48 css(=48×舞台宽/390);横屏 116 设计 px(舞台 1792);币面字号 chipFontDesign=max(12/scale, 横屏?26:0);CHIP_CSS 写死 .chips button{width:var(--coind)} | fit.ts:113 / :145-148(源码) |
| 触控 Hit | ≥48×50 css(满足 44) | 量的 |
| 来源 Source | graphic-amg/skin/chicken/hud/imgCoins1-6.png + imgHighlight.png;shell.ts:47 / render();style.css .chips | 图=原档(SHA=线上);叠字/选中/禁用=代码件 |
P9 · PLAY 钮 · PLAY button HUD-PLAY




| 项目 Item | 规格 Spec(量的,390×844 DPR3 headless Chromium,除注明) | 状态 / 来源 Status · Source |
|---|---|---|
| 原图 Source | btnPlay.png 200×77 px,sha 57009998(5 款线上同档);图上带「PLAY」字(图内字),无 DOM 文字 | 量的 |
| 显示高 Display h | chicken 56 · croc 56.5 · wheel 56 · tower 51.8 | 取 56(3/4) |
| 显示宽 Display w | chicken 136 · croc 185.6 · wheel 216 · tower 134.2(background-size:contain,宽随版面) | 取 216(wheel 实测,总监 #1650 定 2026-10-23) |
| 位置 Pos | chicken x242 y670 · croc x193 y759 · wheel x162 y752 · tower x243 y715;距底:118 / 28 / 36 / 77 | 取 wheel:PLAY x162 y752,距底 36,不留纯色垫底(总监 #1650 定 2026-10-23);见第 19/20 页 |
| 禁用 Disabled | .imgbtn:disabled{filter:grayscale(.85) brightness(.7)}(chicken、croc、wheel;wheel 用 .play.off 同值);tower grayscale(1) brightness(.6) | 取 grayscale(.85) brightness(.7)(3/4) |
| 按下 Pressed | wheel scale(.93)+brightness(1.2);tower scale(.92)+brightness(1.25);chicken、croc 无按下变化 | 取 scale(.93)+brightness(1.2)(wheel,总监 #1650 定 2026-10-23);见第 18 页 |
| 触控 Hit | 高 ≥44(51.8–56.5) | 量的 |
| 来源 Source | graphic-amg/skin/chicken/hud/btnPlay.png;shell.ts:49 (button.imgbtn.play);style.css .imgbtn | 图=原档 |
P10 · 清除 / HAPUS 钮 · Clear (HAPUS) button HUD-CLEAR




| 项目 Item | 规格 Spec(量的,390×844 DPR3 headless Chromium,除注明) | 状态 / 来源 Status · Source |
|---|---|---|
| 原图 Source | btnClear.png 217×212 px,sha fc438457(5 款线上同档);图上无字 | 量的 |
| 显示尺寸 Display | 58.5×58.5(4/4 款同) | 量的 |
| 文字 Label | 「HAPUS」DOM :font 900,竖屏 12px,白,text-shadow 0 2px 3px #000,letter-spacing .04em;居中叠在图上 | style.css .clear span(源码);截图可见 |
| 位置 Pos | chicken x177 y671 · croc x131 y758 · wheel x323 y651 · tower x328 y652(wheel/tower 与筹码同行,chicken/croc 在下一行) | 取 wheel 摆法:与筹码同行 x323 y651(总监 #1650 定 2026-10-23);见第 20 页 |
| 禁用 Disabled | chicken filter grayscale(.85) brightness(.7);croc=wheel .clear.imgbtn:disabled{filter:none;opacity:.5};tower grayscale(.5) brightness(.95) contrast(1.4) opacity .9 |
取 opacity .5(croc=wheel 2/4) |
| 按下 Pressed | .clear:active:not(:disabled){filter:brightness(1.35)};.clear{transition:filter .08s};.clear span{color:#fff!important;font-weight:900;text-shadow:0 2px 3px #000;letter-spacing:0} | fit.ts:112 CLEAR_CSS(8 款里 7 款 bundle 带同串;四款实测吻合) |
| 来源 Source | graphic-amg/skin/chicken/hud/btnClear.png;shell.ts:48 | 图=原档 |
P11 · 总下注框 TOTAL TARUHAN · Total bet box TOTAL




| 项目 Item | 规格 Spec(量的,390×844 DPR3 headless Chromium,除注明) | 状态 / 来源 Status · Source |
|---|---|---|
| 尺寸 Size | chicken 150×72 · croc 118.7×56.5 · wheel 140×56 · tower 167.7×54.6 | 取 140×56(wheel 实测,总监 #1650 定 2026-10-23) |
| 位置 Pos | 左下:chicken x12 y664 · croc x11 y759 · wheel x12 y752 · tower x210 y591(与「PETAK」框同行) | 取 wheel 摆法:左下 x12 y752(总监 #1650 定 2026-10-23);见第 20 页 |
| 底/边/角 Skin | 玻璃渐变 .9/.9;1px rgba(255,200,80,.45);圆角 10(chicken、wheel;croc 显示 4.7、tower 6.6) | 取圆角 10(2/4) |
| 标签行 Label | 「TOTAL TARUHAN」: chicken 12.1px/700 · croc 12.1px/800 · wheel 12.1px/800 · tower 未取到(显示值) | 量的;色 chicken #e8d9a8 |
| 数值行 Value | chicken 22.0px/800 · croc 17.0px/800 · wheel 22.0px/800 · tower 未取到;白,千分位点,tabular-nums | 量的(显示值) |
| 错误态 Error | 余额不足:边 #e14b4b、数字 #ffb4b4(chicken 源码 CSS .totalbet.err) | 线上 demo 触发不了(余额 5,000,000),仅源码 CSS,未取线上截图 |
| 对比度 Contrast | 白数字/玻璃 12.1–19.3:1;错误红边/玻璃 4.28:1(非文字边) | 量的 |
| 来源 Source | shell.ts:45 (#totalbet.totalbet.glass);style.css .totalbet;tower 用 .card.total 另一套 DOM | 代码件 |
P12 · 下注面板底 Bet panel base · Bet panel base (bottom sheet) PANEL-BOTTOM




| 项目 Item | 规格 Spec(量的,390×844 DPR3 headless Chromium,除注明) | 状态 / 来源 Status · Source |
|---|---|---|
| 有无 Exists | croc 有 · wheel 有 · chicken 无 · tower 无 | 取 有,直角(wheel,总监 #1650 定 2026-10-23):y470 起 390×374,渐变 #2a1f12f7→#120d08fc、上边 2px rgba(255,200,80,.55)、阴影 0 -10px 30px #0009;croc 的圆角 28 要改直角;chicken/tower 要补 |
| croc | x0 y560.5 · 390×283.5 · 渐变 · 圆角 28 28 0 0;box-shadow | 线上 getBoundingClientRect(量的) |
| wheel | x0 y470 · 390×374 · linear-gradient(rgba(42,31,18,.97), rgba(18,13,8,.99)) · 圆角 0 · 阴影 rgba(0,0,0,.6) 0 −10 30 | 量的 |
| 实现 Impl | 各款自己的 CSS(#panel / .panel),无 PNG 原件 | 无共用源码,列为「缺共用件」 |
| 与 Victor 令的关系 | 10-10 令「底部不准纯色垫底」:有面板底的款(croc、wheel)底部由面板铺满;chicken 竖屏最底 60px 条标准差 2.2(≈纯色) | 盘点 #15;裁决见第 19 页 |
P13 · 说明弹窗 Info (rules) popup · Info popup PANEL-INFO


| 项目 Item | 规格 Spec(量的,390×844 DPR3 headless Chromium,除注明) | 状态 / 来源 Status · Source |
|---|---|---|
| 面板 Panel | chicken:x24 y85 · 341.8×674 · padding 22/28 · 2px solid #ffd24a · 圆角 18 · linear-gradient(#b8956f → #61492e) · 阴影 0 10 40 rgba(0,0,0,.6) | 量的;wheel 366×479(x12 y70,圆角 16,padding 16)、croc 329.7×206(圆角 16) |
| 标题 Title | font 900,竖屏 24px,letter-spacing 1px,白 + text-shadow 0 2px 0 rgba(0,0,0,.4)(源码 CSS) | 实读源码 |
| 正文 Body | font 500 17px/1.5 白;规则表:th 14px/800 #2a1b06,td 14px/700 白 on rgba(20,15,10,.55) | 源码 CSS |
| 关闭钮 Close pill | 金胶囊「Tutup」:chicken 120×44、字 900 18px、#3a2605、2px #ffd24a、渐变 #ffe48a→#e0a52a 60%→#a87414、圆角 999;croc 109×45(字 30px×0.471)、wheel 126×46(字 20px) | 量的 |
| TUTUP 大小写 | chicken=croc「TUTUP」全大写 · wheel=tower「Tutup」首字大写(四款均已量:tower 实测 Tutup) | 取 「Tutup」(wheel,总监 #1650 定 2026-10-23);chicken/croc 要改 |
| 暗幕 Scrim | 盖满整个视口 rgba(0,0,0,.55)(含延伸带) | 源码 CSS r5 #49/#50 |
| 对比度 Contrast | 正文白/面板:上沿 #b8956f 2.78:1、下沿 #61492e 8.4:1;标题 #2a1b06/#b8956f 6.02:1;TUTUP #3a2605/金 3.54–11.45:1 | 量的。白字在面板上半部低于 AA 4.5:1,为线上现状,标准照取,列「要 Victor 拍」 |
| 来源 Source | shell.ts:116-119(sheet===rules 段);style.css .popup/.popup.info/.go2;线上 CSS https://amg-kancilroad.pages.dev/assets/index-Bk4cNRm-.css | 代码件 |
P14 · 记录面板 History panel (RIWAYAT) · History panel PANEL-HIST


| 项目 Item | 规格 Spec(量的,390×844 DPR3 headless Chromium,除注明) | 状态 / 来源 Status · Source |
|---|---|---|
| 面板 Panel | x78 y64 · 300 宽(右缘距屏 12)· padding 12 · linear-gradient(rgb(40,30,18) → rgb(20,15,10)) · 1px rgba(255,200,80,.5) · 圆角 10(chicken、wheel;croc computed 2px/21.2px,×0.471=显示 0.94/10) | 4/4 款位置同(量的) |
| 标题 Title | RIWAYAT:h3 14px/800 #f1dfae,letter-spacing .1em | 量的(chicken、wheel computed) |
| 行 Rows | .r:display flex 两端对齐;font 600 13px;上缘 1px rgba(255,200,80,.2);padding 6px 0 | 源码 CSS |
| 空态 Empty | 「Belum ada riwayat…」(印尼文;en:No history yet) | 线上实拍 |
| 有数据态 With data | 线上 demo 无记录,未取有数据截图;行内容=时间/下注/结果/派彩(宿主 history.load) | 未核实:有数据排版 |
| 来源 Source | shell.ts:121(sheet===history 段);style.css .hist | 代码件 |
P15 · 结算卡 / 赢钱弹窗 · Result card / win popup WINPOP · WP-*




| 项目 Item | 规格 Spec(量的,390×844 DPR3 headless Chromium,除注明) | 状态 / 来源 Status · Source |
|---|---|---|
| 件 Parts(11 个原图,@2x) | 面板 9-slice 680×600 (7a014815) · 标题彩带 800×104 (651f9a56) · 金额牌 584×152 (6c44773f) · 奖杯台 360×44 (46b7de2f) · 英雄位(默认) 192×192 (96b1701e) · 光芒 1200×1200 (317db752) · 金币 56×56 (6e0ceaf1) · 飞行标记 80×80 (78776eba) · 彩纸精灵表 288×48 (0c47edf0) · 继续钮 340×96 (a4bec331) · 关闭钮 88×88 (9534129e) | 6 款线上同档(每件 SHA 逐件相同,量的);batik-strip 线上未引用,不取 |
| 版式 Layout | layout.ts DIMS(面板宽,英雄槽,金额字号,彩带高):竖屏 small 320/88/34/44、big 340/104/42/46、mega 350/124/52/52;横屏 small 400/64/32/40、big 440/76/38/42、mega 470/88/44/46 | 源码 winpopup/src/layout.ts(与设计稿 layouts.json 对拍) |
| 档 Tiers | small / big / mega(MEGA MENANG),同一张卡;赢才弹,输不弹(Victor 规则) | 线上无输态弹窗件(缺,设计如此) |
| 文案 Copy | 「MENANG」「+金额」「2.50x · Net +1.500」「LANJUT」(印尼文);关闭 × 在右上 | 线上实拍 |
| 位置 Pos | 屏幕正中弹出,面板水平居中;金额大字 + 派彩飞入余额 | Victor 10-22 规则 |
| 对比度 Contrast | 金额 #ffd24a/绿牌深绿(目视,未逐色量);LANJUT 钮同 TUTUP 3.54–11.45:1 | 推的/量的混合,金额对比度未逐色量 |
| 来源 Source | graphic-amg/winpopup/src/{layout,view,parts}.ts + parts/*.png | PNG=原档;组装=代码件 |
P16 · 错误卡 Error card V1 · Error card (V1: dark-brown) ERRCARD



| 项目 Item | 规格 Spec(量的,390×844 DPR3 headless Chromium,除注明) | 状态 / 来源 Status · Source |
|---|---|---|
| 版式 Layout | 全屏居中:印尼文主句 17px/600 → 英文副句 13px/500(opacity .7)→ 金胶囊钮;容器 max-width 340;gap 14 | 量的(croc、wheel、tower 三款逐像素同:钮 x125.7 y457.8 138.6×48) |
| 底色 Bg | V1 深棕 #120d08(croc、wheel、tower);chicken 藏青 #060a18 | 取 V1(3/4)(盘点 #11) |
| 字色 Text | #f1dfae;对比度 14.64:1(V1)/ 14.94:1(chicken) | 量的 |
| 钮 Button | 「Coba lagi」:高 48,padding 0 28,圆角 999,2px #ffd24a,渐变 #ffe48a→#e0a52a,字 900 17px #3a2605;对比度 6.57–11.45:1 | 量的 |
| 无会话态 No-session | V1:同卡,文案「Tidak ada sesi…」+ 英文副句 + 同钮(croc、wheel、tower);chicken 是单语 +「OK」钮(V2,不取) | 线上实拍 |
| 来源 Source | games/{croc,wheel,tower}/graphic-amg/app-*/src/card.ts(三份逐行同,仅 import 不同);chicken 在 app-chicken/src/main.ts:30(藏青) | 代码件,内联样式 |
P17 · 载入页 Loading screen · Loading screen LD-TRACK · LD-FILL · LD-KNOB · LOADBAR




| 项目 Item | 规格 Spec(量的,390×844 DPR3 headless Chromium,除注明) | 状态 / 来源 Status · Source |
|---|---|---|
| 条三件 Bar parts | bar-track.png 1024×112(88b6463c)· bar-fill.png 1024×88(f08a022f)· bar-knob.png 192×192(08d6964d);轨/填充 7 款同档 | 量的;9-slice 帽 56/44(图 px) |
| 把手 Knob | 4 款 3 个版本:chicken=wheel(08d6964d)· tower(cd97e0cd)· croc(d5843c93,clay) | 取 08d6964d(2/4)(盘点 #12) |
| 设计舞台 Stage | 竖 828×1792、横 1792×828;轨框竖 72,1640,684×56(skin/loading.ts);桌面 ≥1024 宽:细条 360×6 居中 | 源码 |
| 文字 Label | 「Memuat…」(印尼)+「N%」,Space Grotesk 700,色 #FFEBC2,描边 #2a1608 5px;桌面 14px | 对比度 16.8:1(#FFEBC2/#060a18 暗带) |
| 背景图 Backdrop | 各款专属标题图(loading-port/land.webp),含底部暗带;不属标准件(每款各有个性,Victor 10-11) | 不列入 SHA 判定 |
| 失败态 Failed | 条隐藏,文字「Gagal memuat」+ 金边胶囊「Coba lagi」(88 高/44px) | 源码 view.ts;线上载入失败态未取到截图 |
| 来源 Source | common/engine/src/loading/view.ts + graphic-amg/skin/src/loading.ts | 代码件 + 原档 |
P18 · 状态总表:按下 · 选中 · 禁用 · State table: pressed · selected · disabled STATES
| 件 · 状态 Piece · state | chicken | croc | wheel | tower | 判定 Verdict |
|---|---|---|---|---|---|
| 顶栏四钮 · 按下 pressed | brightness(1.35)+内凹阴影 | 同 | 同 | 同 | 取(4/4;fit.ts HOME_CSS :active;实测 mousedown 吻合) |
| CLEAR/HAPUS · 按下 | brightness(1.35) | 同 | 同 | 同 | 取(4/4;fit.ts CLEAR_CSS) |
| PLAY · 按下 pressed | 无规则 | 无规则 | scale .93 + brightness 1.2 | scale .92 + brightness 1.25 | 取 scale(.93)+brightness(1.2)(wheel,总监 #1650 定 2026-10-23);chicken/croc/tower 要加 |
| 筹码 · 按下 | 无规则 | 无规则 | 无规则 | 无规则 | 取 无(4/4) |
| PLAY · 禁用 disabled | grayscale(.85) brightness(.7) | 同(+cursor default) | 同(.play.off) | grayscale(1) brightness(.6)(.play.off) | 取 grayscale(.85) brightness(.7)(3/4) |
| CLEAR/HAPUS · 禁用 disabled | grayscale(.85) brightness(.7)(沿用 .imgbtn:disabled) | opacity .5(filter none) | opacity .5(filter none) | grayscale(.5) brightness(.95) contrast(1.4) opacity .9 | 取 opacity .5(croc=wheel 2/4) |
| PLAY · 请求中 pend(脉冲动画) | 无 | 无 | .play.pend:brightness 脉冲 .5s 往返(到 1.35)+金色 drop-shadow | 同 wheel | 取 wheel:.play.pend 脉冲 .5s 往返(到 1.35)+金色 drop-shadow(总监 #1650 定 2026-10-23(r2:一律取 wheel));chicken/croc 要加 |
| 筹码 · 选中 selected | scale 1.10 + 环 | scale 1.10 + 环 | scale 1.10 + 环 | scale 1.10 + 环(chip.sel) | 取(4/4,量的:选中 52.8×55.2 vs 常态 48×50.7) |
| 筹码 · 禁用 .cdis | grayscale(1) brightness(.55) | 同 | 同 | 同(tower 常态 48×48) | 取(500K 在 demo 余额下实拍为 cdis) |
| 筹码列 · 局中 .chips.off | opacity .5 | opacity .45 | opacity .45 | grayscale(1) brightness(.6) opacity .8 | 取 .45(croc=wheel) |
| 总下注框 · 错误 err | 边 #e14b4b / 数字 #ffb4b4(源码) | 未核 | 未核 | 未核 | 部分:仅 chicken 源码 CSS,线上未触发 |
本页数值读自线上 CSS/注入样式(grep 实读 + fit.ts 源码),并用真 mousedown 实测交叉验证(PLAY 在 wheel/tower 的 scale 与规则吻合;注意 wheel/tower 的 PLAY 在 pend 态有脉冲动画,mousedown 取样可能混入动画帧,所以以规则为准)。禁用态截图是把 disabled 属性强设后渲染线上规则(shots/<款>/disabled-forced-*.png),因 demo 下 PLAY/CLEAR 不会自然进入禁用态。
P19 · 差异裁决表 · Decision table DECISIONS
| # 项 Item | chicken | croc | wheel | tower | 判定 Verdict(多数款;原未定项=总监 #1650 定,一律取 wheel 实测) |
|---|---|---|---|---|---|
| 票内 5 项 1 · 余额胶囊尺寸(盘点 #3) | 140×48 | 136.6×50.4 | 140×56 | 141.3×50.9 | 取 140×56(wheel,总监 #1650 定 2026-10-23) |
| 2 · 说明弹窗关闭钮大小写(#8) | TUTUP | TUTUP | Tutup | Tutup | 取 「Tutup」(wheel,总监 #1650 定 2026-10-23) |
| 3 · 错误卡底色(#11) | 藏青 #060a18 | 深棕 #120d08 | 深棕 #120d08 | 深棕 #120d08 | 取深棕 V1(3/4) |
| 4 · 载入把手(#12) | 08d6964d | d5843c93 | 08d6964d | cd97e0cd | 取 08d6964d(2/4,第一名唯一) |
| 5 · 竖屏底部留白(#15) | 最底 60px 条标准差 2.2(≈纯色;盘点 DPR2 量的,其余款 6.8–67.7);本版 DPR3 实拍 PLAY 距底 118 | 距底 28 | 距底 36 | 距底 77 | 取 wheel:PLAY 距底 36;不留纯色垫底(3/4 多数)(总监 #1650 定 2026-10-23) |
| 票外新发现 6 · 玻璃令牌 glass1/glass2/line | .88/.92/.45 | .9/.9/.45 | .9/.9/.45 | .92/.92/.5 | 取 .9/.9/.45(croc=wheel,2/4);chicken、tower 要改 |
| 7 · .glass CSS 写法(渐变/边/圆角/阴影) | 无 180deg;阴影 0 4 18 #00000073 | 180deg;阴影 0 2 10 #00000080 | 同 croc | tower 无 .glass(用 .card) | CSS 写法取 croc=wheel(FRAG-GLASS);显示阴影取 wheel 的 0 2px 10px #00000080(总监 #1650 定 2026-10-23) |
| 8 · 顶栏四钮(位置/尺寸/渐变/边/圆角/阴影) | 同 | 同 | 同 | 同 | 取(4/4 全同,量的) |
| 9 · 筹码/清除 显示尺寸 | 48×50.7;58.5 | 同 | 同 | 常态 48×48;58.5 | 取(筹码 3/4;清除 4/4) |
| 10 · PLAY 显示高/宽 | 56/136 | 56.5/185.6 | 56/216 | 51.8/134.2 | 取 216×56(wheel;高 56 亦 3/4 多数)(总监 #1650 定 2026-10-23) |
| 11 · PLAY 按下态 | 无 | 无 | scale .93 + 亮 1.2 | scale .92 + 亮 1.25 | 取 scale(.93)+brightness(1.2)(wheel,总监 #1650 定 2026-10-23) |
| 12 · 下注面板底 | 无 | 有(圆角 28) | 有(直角) | 无 | 取 有,直角(wheel,总监 #1650 定 2026-10-23) |
| 13 · 总下注框/余额数字号/位置 | 150×72 | 118.7×56.5 | 140×56 | 167.7×54.6 | 总框取 140×56(wheel,总监 #1650 定 2026-10-23);余额数取 20px(wheel 实测,总监 #1650 定 2026-10-23(r2:一律取 wheel));横屏余额/总框照 P21 实测 |
| 14 · 余额圆角(显示) | 10 | 4.7 | 10 | 6.6 | 取 10(2/4) |
| 15 · 面值字重/色 | 800/白.78 | 800/白 | 800/白 | 700/白 | 取 800/白(croc=wheel) |
票述「5 项小差」在 1–5 行;6–15 行是本次实测另发现的差异,按同一规则处理(取最多款;并列/各异=未定,不擅定)。croc/tower 的显示值=computed×0.471(推的),其余为量的。原「未定」项(1、2、5、7、10、11、12、13 + P20 摆法参考)已由总监 #1650(Victor 授权)一律取 wheel 实测值定案,裁决正本 reports/amg-ui-decisions-1650-20261023.md;改完全部界面逐张给 Victor 过目、点头才上。
P20 · 摆法图 · 直立 390×844 · Placement · portrait LAYOUT

| 项目 Item | 规格 Spec(量的,390×844 DPR3 headless Chromium,除注明) | 状态 / 来源 Status · Source |
|---|---|---|
| 1 · Home → TB-HOME | x12 y12 · 44×44 | wheel 实机 DOM(量的) |
| 2 · 余额胶囊 Balance → BAL | x64 y12 · 140×56 | wheel 实机 DOM(量的) |
| 3 · 说明 i → TB-INFO | x208 y12 · 44×44 | wheel 实机 DOM(量的) |
| 4 · 声音 Sound → TB-SOUND | x260 y12 · 44×44 | wheel 实机 DOM(量的) |
| 5 · 记录 History → TB-HIST | x312 y12 · 66×44 | wheel 实机 DOM(量的) |
| 6 · 筹码列 Chips → CHIPROW + HUD-CHIP-* + HUD-RING | x10 y656 · 308×48 | wheel 实机 DOM(量的) |
| 7 · 总下注 Total → TOTAL | x12 y752 · 140×56 | wheel 实机 DOM(量的) |
| 8 · 清除 HAPUS → HUD-CLEAR | x323 y651 · 58×58 | wheel 实机 DOM(量的) |
| 9 · PLAY → HUD-PLAY | x162 y752 · 216×56 | wheel 实机 DOM(量的) |
| 10 · 下注面板底 Panel → PANEL-BOTTOM | x0 y470 · 390×374(直角,深棕渐变,上边 2px 金) | wheel 实机 DOM(量的) |
| 已定 Decided | 参考排法=wheel;距底 36;面板底有且直角 | 总监 #1650 定 2026-10-23 |
| 确定 Fixed | 顶栏五件(Home x12 / 余额 x64 / i x208 / 声音 x260 / 记录 x312,y12)四款完全相同;筹码 48×50.7、清除 58.5×58.5 | 4/4 款同 |
线上 wheel 实机渲染(隐藏玩法控件、中性灰底),零件是线上原件,非重画。参考由 croc 改 wheel(总监 #1650 定 2026-10-23)。
P21 · 摆法图 · 横屏 844×390 · Placement · landscape LAYOUT

| 项目 Item | 规格 Spec(量的,390×844 DPR3 headless Chromium,除注明) | 状态 / 来源 Status · Source |
|---|---|---|
| 1 · Home → TB-HOME | x12 y12 · 44×44 | wheel 实机 DOM(量的) |
| 2 · 余额胶囊 Balance → BAL | x64 y12 · 118×53 | wheel 实机 DOM(量的) |
| 3 · 说明 i → TB-INFO | x662 y12 · 44×44 | wheel 实机 DOM(量的) |
| 4 · 声音 Sound → TB-SOUND | x714 y12 · 44×44 | wheel 实机 DOM(量的) |
| 5 · 记录 History → TB-HIST | x766 y12 · 66×44 | wheel 实机 DOM(量的) |
| 6 · 筹码列 Chips → CHIPROW + HUD-CHIP-* + HUD-RING | x169 y329 · 507×55 | wheel 实机 DOM(量的) |
| 7 · 总下注 Total → TOTAL | x13 y333 · 123×51 | wheel 实机 DOM(量的) |
| 8 · 清除 HAPUS → HUD-CLEAR | x779 y265 · 58×58 | wheel 实机 DOM(量的) |
| 9 · PLAY → HUD-PLAY | x728 y335 · 110×45 | wheel 实机 DOM(量的) |
| 说明 Note | wheel 有横屏版,以其实测为准(量的);横屏无面板底;余额/总框/PLAY 在横屏的显示尺寸小于直立 | 目视+量的 |
| 同套零件 Same set | 与直立页是同一批件(同 PIECES id);只是摆法不同,不算两套 | Victor 10-23 令 |
同上;横屏。
P22 · 缺件 · 未核实 · 不取 · Missing · unverified · not taken MISSING
| # 件 Piece | 状态 Status | 说明 Detail | 处置 Handling |
|---|---|---|---|
| WP-batik-strip 赢钱弹窗·batik-strip@2x.png | 缺(线上未引用,不取) | 源码包 graphic-amg/winpopup/parts/ 有此档,但线上 8 款的 CSS/JS 都没引用(sha-live-assets.csv 无此名);规则:源码件仅 SHA 与线上一致才取 | 不补画、不 AI 生成;要新件须先问 Victor |
| LOSE-POPUP 输态结算弹窗 | 缺(设计如此) | Victor 规则:输钱不弹窗;线上也没有该件,不补画 | 不补画、不 AI 生成;要新件须先问 Victor |
| PANEL-BOTTOM 下注面板底(底部玻璃抽屉) | 已定(总监 #1650 取 wheel) | croc、wheel 有深棕面板底(croc 顶圆角 28、h283;wheel 直角、h374),chicken、tower 没有 → 总监 #1650 定 2026-10-23:取 wheel(有,直角,y470 起 390×374);实现是各款自己的 CSS(.panel),无 PNG | 不补画、不 AI 生成;要新件须先问 Victor |
| FISH-ROOM fishshoot 房内 HUD/下注/结算 | 未核实 | 线上包无 demo 开关,房内需真后端会话;选房页/载入页是藏青+金另一套,不当深棕玻璃件取;不补画 | 不补画、不 AI 生成;要新件须先问 Victor |
| ERR-STATES 错误卡其它版本(V2 藏青单语+OK / V3 crash 浅棕绿钮 / V4 fishshoot) | 不取 | 不属多数版(V1 深棕 3/4) | 不补画、不 AI 生成;要新件须先问 Victor |
| TOTAL-ERR 总下注框「余额不足」态 | 部分(仅源码 CSS) | style.css .totalbet.err 有规则;线上 demo 余额 5,000,000 触发不了,未取到线上截图 | 不补画、不 AI 生成;要新件须先问 Victor |
| PRESS-STATE PLAY 按下态(顶栏钮/CLEAR 按下态四款同=brightness(1.35),已入标准) | 已定(总监 #1650 取 wheel) | 线上 wheel/tower 有 :active scale(.93/.92)+brightness(1.2/1.25),chicken/croc 无 → 总监 #1650 定 2026-10-23:取 wheel scale(.93)+brightness(1.2)(FRAG-PLAY-PRESS);见 STANDARD 状态总表(第 18 页) | 不补画、不 AI 生成;要新件须先问 Victor |
| FSBTN 全屏钮(线上渲染) | 取到(线上渲染,Android UA 无头) | 线上 chicken Android UA 390×844 DPR3:钮 x334 y64 44×44,底 linear-gradient(rgba(40, 30, 18, 0.9), rgba(20, 15, 10, 0.94)),边 1px solid rgba(255, 200, 80, 0.5),圆角 9.68px,色 rgb(255, 210, 74)(量的;截图 shots/chicken/android-bet-m390.png) | iPhone 不显示(设计如此);不补画 |
| 折叠 1812×2176 / iPad 1024×1366 / 桌面 1920×1080 实拍 | 未重拍 | 旧盘点为 DPR1 截图,不冒称符合家规;顶栏钮边长按 fit.ts 公式推为 72(推的);其它件(筹码/PLAY/总框)在桌面/iPad 的位置未在本版重量 | 派下一轮实拍 |
| 真 token 会话下的状态(真余额/真历史/真赢钱金额) | 未核实 | 不登入后台;demo 数字是 mock,UI 件是线上真件 | — |
| 记录面板有数据态 | 未核实 | demo 无记录 | — |
| 载入失败态(Gagal memuat) | 仅源码 | 线上未触发 | — |
| MEGA 档赢钱弹窗(大赢)线上渲染 | 部分 | 源码 DIMS 有 big/mega;plinko、catfish 实拍到 MEGA MENANG(同卡),chicken/croc/tower/wheel 只拍到小档 | — |
| 赢后结果条「ANDA MENANG +金额」 | 已定:取 wheel(有) | 弹窗关掉后 wheel 底部多一条结果条(wheel t8 实拍;catfish 亦有),chicken、croc、tower 没有 → 总监 #1650 定 2026-10-23(r2:一律取 wheel):取 wheel,即标准含此结果条;chicken/croc/tower 要补(样式照 wheel shots/wheel/win-t8.0.png) | shots/wheel/win-t8.0.png |
P23 · 验收规则 + check-conformance · Acceptance rule + check-conformance RULE
| 项目 Item | 规格 Spec(量的,390×844 DPR3 headless Chromium,除注明) | 状态 / 来源 Status · Source |
|---|---|---|
| 规则 Rule | 改完后每款游戏的每个标准零件必须与 PIECES.csv 的 SHA256 完全相同(逐档比对,不是目视);一款差几件由脚本数出来 | Victor 2026-10-23 追令 |
| 范围 Scope | PIECES.csv 中 required=Y 的 25 个图/字件(逐档 SHA);另加 11 个代码件片段(令牌/.glass 的规范化 CSS 与 9 条 SVG path 串);--render 再加显示值(顶栏四钮位置/尺寸/底/边/圆角/色,余额/总框 140×56+阴影,筹码,清除,PLAY 216×56 距底 36,面板底,说明弹窗关闭钮「Tutup」)与 1 个按下态片段 FRAG-PLAY-PRESS | #1650 已定项的阈值已同步进 pieces/code/render-spec.json 与 fragments.json;仍「未定」件不进判定 |
| 脚本 Script | (internal)(Python3 标准库,只读;只做 GET,不写任何档,除非 --json) | |
| 输入 Input | 目录(dist/ 或源码树)· .zip · 线上 URL(只 GET)· --each 父目录(每个子目录当一款) | 构建哈希文件名无关,按内容 SHA 比 |
| 输出 Output | 每款:图/字件 N/25 相同、差几件;逐件 PASS / DIFF(同名不同 SHA)/ MISSING;代码件片段 PASS/DIFF/MISSING;汇总每款差几件;退出码 0=全过 1=有差 2=读不到 | --quiet 只印汇总;--json out.json 另存 |
| 渲染比对 Render(代码件) | --render:对 URL 用无头 Chromium(demo 模式,浏览器内 mock,不联网写)量 390×844 下显示值,对 render-spec.json;croc/tower 的舞台缩放自动换算(按 .ib.home 字号)。为什么要它:8 款 bundle 都带同一份共用 HUD CSS(fit.ts),字串比对全过,但 plinko/catfish 的奶油皮是后覆盖的——只有量显示值才抓得到 | 需要 python playwright;没装就跳过这一项 |
| 用法 Usage | ./check-conformance [--render] https://amg-kancilroad.pages.dev https://amg-komodo.pages.dev …(结果见 measure/conformance-live-8*.txt/json) | 每次改动(含 AMG 自己改)都跑 |
| 基线 Baseline(#1650 后,线上 4 款,量的) | (#1650 后,含显示值,线上四款)chicken 差 9 · croc 差 7 · wheel 差 0 · tower 差 9 | measure/conformance-after-1650-r2.json/.txt(含显示值);改前 8 站基线见 measure/conformance-live-8*.json;赛马 kit v4 差 23、赛车 kit v2f 差 6(图/字件,measure/conformance-kits.json) |
| 计数口径 Counting | 脚本汇总的「差 N 件」按检查项计(同一 id 的图/字 SHA、片段、显示值各算 1 项);DIFF-TO-ADOPT.md 的换件数按 PIECES.csv id 去重计。标准四款自己也有差(#1650 后检查项:wheel 0 · croc 7 · chicken 9 · tower 9;按 id 去重:0 / 6 / 7 / 7 件;wheel 0 差(余额数字标准=20px,#1650 r2)),要一起改才算「一模一样」 | 见 DIFF-TO-ADOPT.md 末尾「标准四款自己也要对齐」 |
| 变更记录 Change log | v2 · 2026-10-23 · 总监 #1650(Victor 授权)定:原 P19「未定/并列」项(1 余额胶囊 140×56、2 关闭钮 Tutup、5 PLAY 距底 36、7 阴影 0 2 10 #00000080、10 PLAY 216×56、11 PLAY 按下 scale(.93)+brightness(1.2)、12 面板底有且直角、13 总下注框 140×56)。r2(同日总监补裁):余额数字 20px、P18 PLAY pend 脉冲、赢后结果条同取 wheel与 P20/P21 摆法参考一律取 wheel 实测;check-conformance 阈值与 DIFF-TO-ADOPT 件数同步;版本仍 v2。 | STANDARD.md 末尾同句 |
| 谁判「通过」 Who passes | 全部 PASS 才算「一模一样」;任何 DIFF/MISSING 都要换件(换成 PIECES.csv 的原档),不准重画 | 版本固定 v2 一个正本;改标准先问 Victor |
变更记录:v2 · 2026-10-23 · 总监 #1650(Victor 授权)定:原 P19「未定/并列」项(1 余额胶囊 140×56、2 关闭钮 Tutup、5 PLAY 距底 36、7 阴影 0 2 10 #00000080、10 PLAY 216×56、11 PLAY 按下 scale(.93)+brightness(1.2)、12 面板底有且直角、13 总下注框 140×56)与 P20/P21 摆法参考一律取 wheel 实测;r2(同日总监补裁):余额数字 20px、PLAY pend 脉冲、赢后结果条同取 wheel;check-conformance 阈值与 DIFF-TO-ADOPT 件数同步;版本仍 v2。
P24 · 动画必备五类 · Required animation set ANIM(Victor 2026-10-25 22:15 令)
Victor:「不是要一模一样的动画,但是都要有这些动画。」每款 AMG 游戏五类都要有,做法各款自定;缺任一类不算过标准。参考做法与节拍 = Mines AMG 包
(internal)+preview-amg-mines-anim.mp4(Victor 10-25「动画做得很好」)。
| 类 Class | 必须有什么 Must have | 量的验收 Measurable acceptance |
|---|---|---|
| ① 进场 Entrance | loading 满 → 背景推入/去模糊 → 名字 logo 弹入 + 一次金光扫 → 场面元素(格/盘/道/鱼)依序落位 → 控件淡入;logo 为独立件(P17 载入页也带 logo) | loading 结束到可操作 ≤3.5s;元素落位总时长 ≤0.9s;logo 出现 ≥1.0s 后才允许点 PLAY |
| ② 主动作反馈 Action feedback | 玩家每次下注/翻格/发射/转动有即时反馈:弹出/缩放/闪光 + ≥7 颗粒子或等效光效;倍率/金额数字滚动而非跳变 | 点下到首帧反馈 ≤80ms;数字滚动 300–600ms;连点不丢帧(≥55fps,量的) |
| ③ 失败/爆点 Lose · bust | 失败有「预告→爆发→余波」三段(例:引线闪→爆炸帧→屏震 + 暗角 + 邻近元素被推开);其余隐藏项随后由近到远揭示 | 预告 ≥120ms;爆发帧 ≥6 帧;屏震幅 8–14px 且 ≤450ms;揭示总时长 ≤1.2s |
| ④ 收钱/庆祝 Win · cashout | 金额脉冲 + 已赢元素轮闪 + 喷泉/飘落(金币/宝石/星屑 ≥3 种) + 结算卡入场(P15 卡本体不改,只加入场与数字滚动) | 粒子 ≥60 颗;庆祝 1.2–2.5s;结算卡入场 ≤400ms;大奖(≥50× 或封顶且派彩 ≥ 本金)有加长版 ≥3s;封顶但派彩 < 本金(例 0.66× 被封)走 ③ 失败段,不庆祝(10-26 04:0x 总监裁) |
| ⑤ 待机 Idle | 画面不死:元素呼吸/金光扫过/余烬或环境粒子;PLAY 钮呼吸(沿 P9 pend 脉冲);有吉祥物位的款留位 | 任意 3 秒内 ≥1 处像素在动;CPU 待机 <15%(量的,Safari 手机) |
| 规则 Rule | 规格 Spec |
|---|---|
| 技术 Tech | Pixi/DOM 精灵图集 + 时间线脚本或 Rive 皆可;新增件(动画/特效件)合计 ≤1.5MB/款;皮肤本体不计入此项,REPORT 另列「皮肤总量」对照同类款整包(10-26 Topo 裁:Topo 整包 4.7MB vs mines 8.9MB 收);粒子/数字滚动用数值驱动 |
| 交付 Deliverables | 每款:TIMING.md(状态名、触发、时长、层序)+ 20s 预览 mp4(真皮件合成,非示意)+ look-weird 抽 3 帧 NONE;接线后再录一次真机 20s |
| 自动局/连发 Auto | 有自动局/连发的款:间隔随局数加速(例 650→230ms),下一目标先出预告框,STOP 有压缩 + 冲击环 |
| 音效 Sound(必备,Victor 2026-10-26 00:3x 令「全部游戏一定要加声音」) | 每款交声音包(BGM 循环、按钮、主动作、失败爆点、收钱、大奖、待机环境音),按节拍表钉点对拍;响度 −16 LUFS ±2、循环无缝、档案 ≤1.5MB/款、授权干净;声音钮(P5)真的开/关;没有声音包不算过标准 |
| 已上线各款 Retrofit | horse/plinko/catfish 已标准化版 + chicken/croc/wheel/tower/crash 逐款补齐五类;次序照 (internal)、总监排程;补完才在 DIFF-TO-ADOPT.md 记「ANIM ✅」 |
| 谁判 Who passes | 总监按本表逐项量(mp4 抽帧 + 节拍表数字);任一类缺 = 不过;与 P23 零件 SHA 规则并列,两者都过才算「符合 AMG 标准 v2」 |
变更记录:P24 · 2026-10-25 22:17 · 总监依 Victor 令新增;v2 版本号不变(追加页)。
10-26 10:0x Victor 追加三条(P25–P27,必备)
- P25 iPhone Duo 适配:AMG 全款必须在 iPhone Duo 内屏(≈669×951 pt 直/横)、外屏(≈610×850 直/横)四态正常:游戏主体居中、遮罩全屏、壳不重叠、字可读;goalshoot 10-24 已过,其余 9 款逐款补。
- P26 声音钮首按即响:第一次点击声音钮必须立刻出声(用那一次手势 resume AudioContext + 已解码件即播;未解码件先播最短 UI 音再补载),钮态即时切换;不准出现「按多次才响」(Victor 10-26 实测)。
- P27 home/返回钮必须有动作:优先
returnUrl/lobby查询参数(AMG 启动时带),其次history.back()(有来源页),再其次https://amglobby.pages.dev/;点了 300 ms 内要有可见反应(按钮按下态/转场)。 - P26 补注(10-26 10:0x 总监裁):进页为「有声」态但 AudioContext 仍 suspended 时,页面上首个任意手势要 resume 并起 BGM;此时 ♪ 第一下视为「开声」(resume+播),不是关声;只有实际出声中按 ♪ 才是关声。钮态=实际可听状态。
- P26 补注二(Victor 10-26 11:4x):所有音效/BGM 在 loading 画面阶段就全部加载并解码完(decodeAudioData 不需要手势),loading 条走完 = 声音已就绪;♪ 第一下只做 resume + 出声(确认音用真实音效,不是因为没解码而合成 blip);不准等到点声音钮才去加载。
补注四(总监 10-26 11:3x,Sol r3 三款同型 FAIL 后定:「开声状态机」,所有款照这个做,不准各自猜)
Sol r3 把 mines/tower/wheel 的 v2 全退回,三款败在同一件事:「实际可听状态」没有一个唯一、随真实播放结果更新的状态源。以下是唯一正确模型,实作与测试都照它:
状态 soundState ∈ {locked, opening, audible, muted},唯一来源(一个模块持有,壳/按钮/BGM/预载全部订阅它,不准各自再存一份 isMuted/opened/heard 当判断依据):
locked:AudioContext suspended 或从未真正出过声(页面刚进、resume 没成功过)。用户偏好prefMuted(localStorage)只是偏好,不是状态。opening:某个手势已在同步栈内调了ctx.resume()+ 已排入确认音/BGM,但 resume 的 promise 还没落定。audible:resume 已 resolve 且 ctx.state==='running',且确认音或 BGM 已start()。muted:用户在audible下按 ♪ 关掉(gain=0 / BGM 停),prefMuted=true。
转移(全部要有测试,每条一个 case):
- 任意元素的首个手势(pointerdown/click/touchend,页面级一次性监听)在
locked→ 同步栈内resume()+ 若prefMuted=false则起 BGM → 进opening;resume resolve →audible;resume reject 或 1.5 s 内 ctx 仍非 running → 回locked(清掉任何「已开」标记,允许下次手势重试),不准停在opening,更不准算audible。 - ♪ 在
locked/opening→ 视为「开声」:同步resume()+ 播已解码的确认音(ui.sound_on类)+ 若有 BGM 起 BGM +prefMuted=false→opening(落定规则同 1)。不是翻prefMuted。 - ♪ 在
audible→muted(gain 0 / BGM pause,prefMuted=true)。 - ♪ 在
muted→audible(gain 恢复 / BGM 续播,prefMuted=false;若 ctx 期间被系统挂起,则走 2 的 resume 路径)。 audible下 ctx 被系统挂起(statechange→ suspended,iOS 切后台/来电)→ 回locked,保留prefMuted不变;回前台的首个手势按 1 处理(prefMuted=true时 resume 但不起 BGM)。- 按钮图示 = f(soundState):
locked/opening/muted画「静音」样式(可加小点表示待开),audible画「有声」;不准用prefMuted画图示。 - loading 放行条件(补注二):清单内全部 cue
decodeAudioData完成(断言decoded === manifest.length);解码不需手势;放行前不准播任何东西;合成 blip 只在某 cue 解码失败时作该 cue 的替身。 - 转移 1/2 的
resume()与start()必须在手势事件的同步栈内调用(不在.then()、不在await之后、不在 setTimeout);测试用「resume 返回挂起的 promise」验证:handler 返回时resume已被调 1 次、start已被调 ≥1 次,而 promise 尚未落定。
测试最少覆盖(每款):①锁态首按 ♪ → opening → resolve → audible,第二按 → muted;②锁态首按 ♪,resume reject → 回 locked,再按一次又会 resume(重试);③任意元素(非 ♪)首按 → opening → resolve → audible,随后按 ♪ → muted(不是再播确认音);④ audible 时 statechange→suspended → locked,图示变静音;⑤图示在上述每个状态的断言;⑥loading 放行时 decoded===manifest.length;⑦退回验红(去掉状态更新那行测试要红)。 Home 钮(P27):按钮元素必须真的带 id="home"(或接线处用的选择器真能选到它),进场 loading 期间可点,点了 300 ms 内有按下态;用真实 click 事件测导航函数被调 1 次(mines v2 的 press('home') 取到 null 抛错 = onBack 从没跑,就是这种假接线)。
P26 补注五 v2(10-26 12:3x 总监裁,Sol 砍过一次 12 条已并入):开声状态机只准有一份实作,放在 common/engine,各款只接线
Sol 四轮(b1/r2/r3/r4a)退回的阻断项是同一件事反复出现:每款各写一套 soundState,各自漏掉一种事件顺序。从本补注起:
1. 共用模块(唯一实作)
common/engine/src/audio/sound-state.ts 导出 createSoundState(opts)。各款壳/页面不准再自己持有 muted/opened/audible/hostMuted 任何旗,不准自己调 ctx.resume()/source.start(),不准有自动开声分支。模块拥有:ctx、输出总闸(一个 master GainNode,所有声音都经它)、state ∈ {locked, opening, audible, muted}、userMuted(静音偏好,独立于 state)、subscribe(fn)、prepare(manifest, onProgress, {deadlineMs})、bindGestures(root, {exclude})、press()、play(cue, opts) → handle|null、startLoop(cue, {loopStart, loopEnd, syncWith?}) → handle|null、setParam(handle, …)、stopAll()、dispose()。
2. 硬规则
- 可信激活事件:
bindGestures只认pointerup/touchend/click与keydown(仅 Enter/Space,过滤 repeat);同一次操作(pointer→click 链)只算一次尝试(用 attempt token 去重)。♪ 钮经exclude排除在通用开声之外,它的一次完整操作只跑一次press()。 - audible 的定义 = 播放就绪并已证明:本次尝试的
resume()已 resolve 且ctx.state==='running'且 在该手势同步栈内提交的内建确认音(模块自带 ~60 ms 已解码非静音 click,base64 内联,不走网络、不会失败)start()成功且 source 已连到输出闸。BGM/替身/静音帧都不是证据。opening期只准起这一个确认音。 - 事件顺序无关 + 尝试代号:每次尝试带 token;resolve/running 任一顺序都行;resolve 了但 ctx 仍 suspended → 等 statechange 或
timeoutMs(默认 1500,可配)→ 超时/reject/中断:停掉该尝试的 source、关输出闸、作废其回调,回locked;迟到的旧 token 结果一律忽略;下一手势可再试。 - loading 闸:
prepare()对清单逐件下载+解码,失败件重试 1 次,再失败建替身(按清单声明的durationMs/循环点建静音 buffer,带 failed 标记,只用于不崩、不作证据、BGM 替身不循环播放);每件互斥计一次(decoded 或 failed);整体deadlineMs(默认 20000)到期把未完成件都记 failed 并 resolve。prepare()resolve 前:play/startLoop丢弃不积压;开声手势也不提交任何声音(只 resume,状态最高到 opening),ready 后不补播,等下一手势。入口核decoded + failed === manifest.length才算 loading 完成。 - 播放许可唯一:
play/startLoop只在audible放行,否则返回 null(调用方据此维护自己的循环状态,不得假设已播);stopAll()停模块拥有的全部 source。 - 生命周期:同时监听 ctx
statechange与visibilitychange/pagehide/freeze;离开 running(suspended/interrupted/closed)或页面离开前台 → 立即关输出闸、停循环、作废当前尝试、state→locked(userMuted不变);系统自行恢复 running 不开闸、不改 state;回前台等下一手势。pageshow(persisted)(BFCache)视同重挂:重新绑定、state=locked。 - 静音偏好:
userMuted由 localStorage 初始化、只由press()翻转;通用手势永不清除它。press()语义:locked/opening → 开声尝试(若 userMuted=true 则同时清偏好);audible → userMuted=true + 关闸 →muted;muted → 开闸 →(ctx 仍 running)audible否则重走开声。图示 = f(state),壳只subscribe。 - 壳不准有第二套决策:壳里
ctx.resume、muted = !muted、hostMuted、自动开声分支一律删除。 - 销毁契约:
dispose()幂等:解绑所有监听/订阅/定时器,作废全部异步结果,停并释放拥有的音频资源。
3. 测试(共用模块自带,各款不重写)
sound-state.test.ts 用假 AudioContext 可控触发 resolve/reject/statechange 顺序与时序,至少覆盖:①–⑦(补注四)+ ⑧ running 先到 reject 后到 → locked;⑨ resolve 先到仍 suspended → 超时 locked 且该尝试 source 被 stop;⑩ 旧 token 迟到 resolve 被忽略;⑪ loading 中手势 → 不提交声音、不 audible、ready 后不补播;⑫ 解码失败件替身计数正确、替身不作证据、BGM 替身不循环;⑬ pagehide/interrupted → 关闸停循环 locked,系统恢复 running 不开闸;⑭ userMuted 下通用手势不出声不清偏好,press 才取消;⑮ ♪ 的 pointer→click 链只算一次 press;⑯ locked 下 play 返回 null、恢复后无积压 start;⑰ dispose 后无监听无 source。 各款只做接线测试:挂载真实壳 DOM,派发 pointerdown/pointerup/click 链(合成事件可以,但不准自己造 dispatch() 直接调回调)真点 ♪ 两次(开声→muted)与 #home 一次(导航函数调 1 次,进场期可点、按下态可见);以及 play() 返回 null 时本款循环状态不被标成已播。 真机验收(每款必做,合成事件不算):iOS Safari 与 Chrome Android 各一段录屏,页面加 ?snddebug=1 时右上角显示 state / ctx.state / 最近 start 的 cue 名 / attempt#;录:首按 ♪、第二按、快速连按两下、进场期点 Home、切后台再回来后首手势、loading 中点 ♪。录屏是交付物。
4. 过渡
以 fishshoot v2 的 director.ts 为底搬进 sound-state.ts;director.ts 旧 API(unmuteBlip/primeBlip/build/onCtxState/prepare/press)只保留转发适配层,一律委托新模块;以下旧行为废除(不是保留):build() 回前台自动 resume、prepare() 完成后补起 BGM、onCtxState() running 自动回 audible、FishSound.loopOn 把被丢弃的启动记成已播。API 要补齐 crash 的双层同步循环(syncWith)与动态混音(setParam)、fishshoot 的循环点,否则各款做不到「只换接线」。各款接线单在共用模块 Sol PASS 之后才派;接线单只准删本款自写状态机、换成模块调用。
P28 · 手机全屏 · Mobile full screen(Victor 2026-10-28 13:2x/13:3x 令,必备)FULLSCREEN
- iOS:直/横屏往上滑要能进全屏(Safari 收起网址栏/标签栏:页面可滚 ≥1px、
scrollTo(0,1)法),首次进场出提示卡「Swipe up for full screen / Geser ke atas」。 - Android:右上角一颗放大钮(
.mg-fs-btn44×44,图标=放大),点了requestFullscreen;全屏中变成缩小钮。 - 唯一实作
common/fullscreen的mount()(含 P29 zoomLock + A2HS 提示),每款 app 入口挂一次,不自己写;页面根不准position:fixed/overflow:hidden把可滚高度锁死。 - 验收(量的):iPhone 模拟器 Safari 直屏载入 → 上滑 →
window.innerHeight增加(写前/后 px)且提示卡出现过一次,横屏同测;Android(Chrome 模拟或真机)放大钮可见、点后document.fullscreenElement非空;线上包 greprequestFullscreen、Swipe up for full screen、mg-fs-btn各 ≥1。2026-10-28 线上扫描:crash/tower/wheel/catfish/plinko/kancilroad/fishshoot/komodo/mines/topo 有模块,dice、goalshoot 没有(待补)。
P29 · 禁缩放 · No zoom(Victor 2026-10-28 13:0x 问「double tap 有挡吗」→ 定为必备)ZOOMLOCK
- 双击放大、双指缩放一律挡掉;唯一实作
common/fullscreen的installZoomLock(随 P28mount()自动挂):viewportmaximum-scale=1, user-scalable=no+ html/body/roottouch-action: manipulation+ iOSgesturestart/gesturechange/gestureend与双指touchmovepreventDefault + 300 ms 内第二下 tap 吞掉再补一个 click(连点仍算点击)。 - 验收(量的):线上包 grep
gesturestart≥1、manipulation≥1;模拟器双击游戏区 3 次视口 scale 仍 1(截图尺寸不变)。
P30 · 演出逻辑关 · Animation causality gate(Victor 2026-10-28 11:5x 批、#1849 定)LOGIC
- 任何演出/结算动画:每个结果有看得见的原因、原因先于结果、没有东西无缘无故动/偏/变;放好的东西不动,除非外力。
- 上游:GDD 演出段必含四栏「演出因果表」(结果 | 原因 | 铺垫在第几步/帧可见 | 结果在第几步/帧);下游:落地录制过
bin/look-logic盲述审(总监机跑)+ look-weird,两关都过才给 Victor。正本(internal)末节。