Files
Fishdice/FishDice/Docs/Handoff/lucky-dice-assets-config-checklist.html
2026-06-23 16:11:06 +08:00

824 lines
37 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>FishDice Lucky Dice 资产与配置交付清单</title>
<style>
:root {
color-scheme: dark;
--bg: #15100e;
--panel: #241815;
--panel-2: #30201a;
--line: #6d4b35;
--gold: #f2c34b;
--gold-2: #ffe084;
--red: #b3192c;
--red-2: #f33f31;
--green: #35b75f;
--blue: #3f9bd6;
--text: #f7ead4;
--muted: #c9aa86;
--shadow: 0 18px 48px rgba(0, 0, 0, .28);
}
* { box-sizing: border-box; }
html { scroll-behavior: smooth; }
body {
margin: 0;
background:
radial-gradient(circle at 50% -60px, rgba(255, 224, 132, .14), transparent 360px),
radial-gradient(circle at 8% 160px, rgba(179, 25, 44, .18), transparent 290px),
var(--bg);
color: var(--text);
font-family: "Microsoft YaHei", "PingFang SC", Arial, sans-serif;
line-height: 1.55;
letter-spacing: 0;
}
header, main, footer {
width: min(1180px, calc(100vw - 32px));
margin: 0 auto;
}
header { padding: 34px 0 18px; }
h1 {
margin: 0 0 8px;
font-size: clamp(28px, 4vw, 46px);
line-height: 1.14;
letter-spacing: 0;
}
h2 {
margin: 34px 0 14px;
font-size: 24px;
letter-spacing: 0;
}
h3 {
margin: 22px 0 10px;
font-size: 18px;
letter-spacing: 0;
}
p, li { color: var(--muted); }
a { color: var(--gold-2); text-decoration: none; }
a:hover { text-decoration: underline; }
code {
color: #ffe9a8;
background: rgba(0, 0, 0, .32);
padding: 2px 5px;
border-radius: 4px;
font-family: Consolas, Menlo, monospace;
font-size: .92em;
}
.lede {
margin: 0;
max-width: 940px;
color: var(--muted);
font-size: 16px;
}
.summary {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 10px;
margin: 20px 0 8px;
}
.summary-item {
border: 1px solid var(--line);
background: rgba(36, 24, 21, .82);
border-radius: 8px;
padding: 12px;
}
.summary-item strong {
display: block;
color: var(--gold-2);
font-size: 19px;
line-height: 1.2;
}
.summary-item span {
color: var(--muted);
font-size: 13px;
}
.nav {
position: sticky;
top: 0;
z-index: 20;
display: flex;
flex-wrap: wrap;
gap: 8px;
padding: 12px 0 14px;
margin-bottom: 8px;
background: rgba(21, 16, 14, .88);
backdrop-filter: blur(12px);
}
.nav a {
display: inline-flex;
align-items: center;
min-height: 34px;
border: 1px solid var(--line);
border-radius: 999px;
padding: 6px 12px;
background: rgba(36, 24, 21, .86);
color: var(--muted);
font-size: 13px;
font-weight: 800;
text-decoration: none;
}
.nav a:hover {
color: var(--gold-2);
border-color: var(--gold);
}
.preview {
position: relative;
overflow: hidden;
min-height: 360px;
margin: 26px 0 8px;
border: 1px solid var(--line);
border-radius: 8px;
background:
radial-gradient(circle at 50% 18%, rgba(255, 230, 110, .28), transparent 180px),
linear-gradient(150deg, #3b2119, #120d0b 66%);
box-shadow: var(--shadow);
}
.preview-title {
position: absolute;
left: 50%;
top: 38px;
transform: translateX(-50%);
color: var(--gold-2);
font-size: clamp(34px, 8vw, 76px);
font-weight: 900;
text-shadow: 0 8px 0 #a6471d, 0 0 18px rgba(255, 224, 132, .7);
animation: title-pop 7.8s infinite;
white-space: nowrap;
}
.preview-board {
position: absolute;
left: 50%;
top: 144px;
transform: translateX(-50%);
width: min(520px, 86vw);
height: 92px;
border: 8px solid var(--gold);
border-radius: 18px;
background: #3b1713;
box-shadow: 0 14px 0 rgba(0, 0, 0, .18), 0 0 24px rgba(242, 195, 75, .28);
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 16px;
padding: 16px;
animation: board-rise 7.8s infinite;
}
.slot {
border: 4px solid #d69422;
border-radius: 12px;
background: #5b2017;
box-shadow: inset 0 0 18px rgba(0, 0, 0, .38);
}
.slot::after {
content: "ROCKET";
display: grid;
place-items: center;
width: 100%;
height: 100%;
color: #fff4c4;
font-size: 13px;
font-weight: 800;
opacity: 0;
}
.slot:nth-child(1)::after { animation: lock-one 7.8s infinite; }
.slot:nth-child(2)::after { animation: lock-two 7.8s infinite; }
.slot:nth-child(3)::after { animation: lock-three 7.8s infinite; }
.preview-tray {
position: absolute;
left: 50%;
bottom: 34px;
transform: translateX(-50%) rotateX(58deg) rotateZ(45deg);
width: 330px;
height: 330px;
border: 10px solid #dfaa4b;
border-radius: 28px;
background: var(--red);
box-shadow: 0 18px 0 #5b2a1d;
animation: tray-rise 7.8s infinite;
}
.die {
position: absolute;
left: 50%;
bottom: 166px;
width: 42px;
height: 42px;
margin-left: -21px;
border-radius: 8px;
background: #fff6df;
border: 2px solid #e6d2ad;
box-shadow: 0 8px 16px rgba(0, 0, 0, .34);
color: #8b1b21;
display: grid;
place-items: center;
font-weight: 900;
animation: dice-roll 7.8s infinite;
}
.die:nth-of-type(2) { animation-delay: .12s; }
.die:nth-of-type(3) { animation-delay: .24s; }
.reward {
position: absolute;
left: 50%;
top: 164px;
transform: translateX(-50%) scale(0);
padding: 10px 18px;
border-radius: 8px;
background: var(--red-2);
color: #fff5dc;
font-weight: 900;
box-shadow: 0 0 28px rgba(255, 221, 94, .7);
animation: reward-launch 7.8s infinite;
}
.preview-title, .preview-board, .preview-tray, .die, .reward, .slot::after {
animation-delay: -2.4s;
}
.section {
scroll-margin-top: 84px;
}
.panel {
border: 1px solid var(--line);
border-radius: 8px;
background: rgba(36, 24, 21, .82);
padding: 14px;
box-shadow: var(--shadow);
}
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
gap: 14px;
}
.grid-2 {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 14px;
}
.grid-3 {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 14px;
}
.collab-board {
scroll-margin-top: 84px;
margin: 26px 0 8px;
border: 2px solid var(--gold);
border-radius: 8px;
background:
radial-gradient(circle at 50% 0, rgba(255, 224, 132, .16), transparent 220px),
rgba(36, 24, 21, .9);
padding: 16px;
box-shadow: 0 0 32px rgba(242, 195, 75, .12), var(--shadow);
}
.collab-board h2 {
margin-top: 0;
color: var(--gold-2);
}
.collab-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 12px;
}
.owner-card {
border: 1px solid rgba(242, 195, 75, .42);
border-radius: 8px;
background: rgba(0, 0, 0, .18);
padding: 14px;
}
.owner-card h3 {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
margin-top: 0;
color: var(--gold-2);
}
.owner-card ul {
margin: 0;
padding-left: 18px;
}
.owner-card li {
margin: 7px 0;
}
.owner-tag {
display: inline-flex;
align-items: center;
min-height: 24px;
border: 1px solid rgba(255, 224, 132, .5);
border-radius: 999px;
padding: 3px 8px;
color: var(--gold-2);
background: rgba(242, 195, 75, .12);
font-size: 12px;
font-weight: 800;
white-space: nowrap;
}
.owner-tag.art { color: #ffd2cf; border-color: rgba(243, 63, 49, .45); background: rgba(179, 25, 44, .18); }
.owner-tag.design { color: #d8ffd8; border-color: rgba(53, 183, 95, .45); background: rgba(53, 183, 95, .14); }
.owner-tag.dev { color: #d8ecff; border-color: rgba(63, 155, 214, .48); background: rgba(63, 155, 214, .14); }
.section-title-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
margin-top: 34px;
}
.section-title-row h2 {
margin: 0 0 14px;
}
.blocking-table {
border: 2px solid rgba(242, 195, 75, .65);
box-shadow: 0 0 26px rgba(242, 195, 75, .08);
}
.compare-table td:first-child {
width: 118px;
color: var(--gold-2);
font-weight: 800;
}
.compare-table td:nth-child(2) {
width: 160px;
color: #ffd2cf;
font-weight: 700;
}
.gap-tag {
display: inline-flex;
margin: 2px 4px 2px 0;
border: 1px solid rgba(243, 63, 49, .45);
border-radius: 999px;
padding: 2px 7px;
color: #ffd2cf;
background: rgba(179, 25, 44, .16);
font-size: 12px;
font-weight: 800;
}
figure {
margin: 0;
overflow: hidden;
border: 1px solid var(--line);
border-radius: 8px;
background: var(--panel);
box-shadow: 0 12px 30px rgba(0, 0, 0, .18);
}
figure img {
display: block;
width: 100%;
height: auto;
}
figcaption {
padding: 10px 12px 12px;
color: var(--muted);
font-size: 13px;
}
table {
width: 100%;
border-collapse: collapse;
overflow: hidden;
border: 1px solid var(--line);
border-radius: 8px;
background: var(--panel);
}
th, td {
border-bottom: 1px solid rgba(109, 75, 53, .65);
padding: 10px 12px;
vertical-align: top;
text-align: left;
font-size: 13px;
}
th {
color: var(--gold-2);
background: var(--panel-2);
font-weight: 700;
}
tr:last-child td { border-bottom: 0; }
.notes {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
gap: 14px;
}
.note {
border-left: 4px solid var(--gold);
background: rgba(36, 24, 21, .9);
padding: 12px 14px;
border-radius: 0 8px 8px 0;
}
.note strong {
color: var(--gold-2);
}
.callout {
margin: 14px 0;
border-left: 4px solid var(--green);
background: rgba(36, 24, 21, .9);
padding: 12px 14px;
border-radius: 0 8px 8px 0;
color: var(--muted);
}
.checklist {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 12px;
margin: 0;
padding: 0;
list-style: none;
}
.checklist li {
border: 1px solid rgba(242, 195, 75, .48);
border-radius: 8px;
background: rgba(48, 32, 26, .86);
padding: 12px 14px;
color: var(--muted);
}
.path-block {
white-space: pre;
overflow-x: auto;
border: 1px dashed var(--line);
border-radius: 8px;
background: rgba(0, 0, 0, .22);
padding: 12px;
color: var(--muted);
font-family: Consolas, Menlo, monospace;
font-size: 13px;
}
footer {
margin: 36px auto 28px;
color: var(--muted);
font-size: 13px;
}
@keyframes title-pop {
0%, 8% { opacity: 0; transform: translateX(-50%) scale(.72); }
16%, 100% { opacity: 1; transform: translateX(-50%) scale(1); }
}
@keyframes board-rise {
0%, 18% { opacity: 0; transform: translateX(-50%) translateY(120px) scale(.86); }
28%, 100% { opacity: 1; transform: translateX(-50%) translateY(0) scale(1); }
}
@keyframes tray-rise {
0%, 20% { opacity: 0; transform: translateX(-50%) translateY(140px) rotateX(58deg) rotateZ(45deg); }
30%, 100% { opacity: 1; transform: translateX(-50%) translateY(0) rotateX(58deg) rotateZ(45deg); }
}
@keyframes dice-roll {
0%, 32% { opacity: 0; transform: translate(-170px, -16px) rotate(0deg); }
42% { opacity: 1; transform: translate(126px, 38px) rotate(420deg); }
52% { opacity: 1; transform: translate(-80px, 28px) rotate(780deg); }
62% { opacity: 1; transform: translate(36px, 16px) rotate(1080deg); }
72%, 100% { opacity: 0; transform: translate(0, 0) rotate(1080deg); }
}
@keyframes lock-one {
0%, 56% { opacity: 0; }
60%, 100% { opacity: 1; }
}
@keyframes lock-two {
0%, 64% { opacity: 0; }
68%, 100% { opacity: 1; }
}
@keyframes lock-three {
0%, 72% { opacity: 0; }
76%, 100% { opacity: 1; }
}
@keyframes reward-launch {
0%, 78% { opacity: 0; transform: translateX(-50%) translateY(70px) scale(.3); }
86% { opacity: 1; transform: translateX(-50%) translateY(-28px) scale(1.15); }
100% { opacity: 0; transform: translateX(-50%) translateY(-86px) scale(.86); }
}
@media (max-width: 760px) {
.summary { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.grid-2, .grid-3, .collab-grid { grid-template-columns: 1fr; }
.section-title-row { display: block; }
.preview { min-height: 300px; }
.preview-tray { width: 240px; height: 240px; bottom: 34px; }
.preview-board { top: 126px; height: 78px; padding: 12px; gap: 10px; }
}
</style>
</head>
<body>
<header id="top">
<h1>FishDice Lucky Dice 资产与配置交付清单</h1>
<p class="lede">
参考目标是桌面上的 Dig&Roll 双四叶草 Lucky Dice 流程拆解页。当前 FishDice demo core 已经足够承接后续开发:
双 Clover 触发 Lucky Dice、三格结果栏、rocket/thief 进入目标模式的逻辑已经跑通;现在需要美术和策划补齐完整表现、特殊结果、运营权重和短玩法规则。
</p>
<section class="summary" aria-label="handoff summary">
<div class="summary-item"><strong>Core 已够</strong><span>继续收外部输入,不继续扩文字 demo</span></div>
<div class="summary-item"><strong>3 格</strong><span>固定特殊骰结果栏是表现基准</span></div>
<div class="summary-item"><strong>x1 / x3 / x20</strong><span>倍率改变价值感,不改变结构</span></div>
<div class="summary-item"><strong>7.5-9s</strong><span>触发到转场的主要表现时长参考</span></div>
</section>
</header>
<main>
<nav class="nav">
<a href="#collab">协作看板</a>
<a href="#flow">核心链路</a>
<a href="#reference">竞品帧图</a>
<a href="#variants">变体对比</a>
<a href="#base-assets">基础素材</a>
<a href="#art">美术清单</a>
<a href="#design">策划配置</a>
<a href="#core">Core 实现</a>
<a href="#next">下一阶段</a>
</nav>
<section id="collab" class="collab-board" aria-label="collaboration blockers">
<h2>协作阻塞看板:这些不是程序 core 内部能补齐的内容</h2>
<div class="collab-grid">
<article class="owner-card">
<h3>美术同学 <span class="owner-tag art">需要交付</span></h3>
<ul>
<li>双四叶草触发:压暗、绿色四叶草爆发、标题强闪光。</li>
<li>基础 UI 套件:背景遮罩、标题字、倍率牌、三格槽、红色托盘、奖励容器。</li>
<li>骰子部件普通骰体、2/3/4/5/6/Clover 面、Lucky 特殊骰体和五类特殊面。</li>
<li>Lucky Dice 三格结果栏、红色托盘、三颗特殊骰飞入和滚动。</li>
<li>逐格锁定、奖励飞出、彩带/粒子、白烟转场。</li>
<li>rocket / thief / chest / bomb / key 五类结果图标和对应命中特效。</li>
</ul>
</article>
<article class="owner-card">
<h3>策划同学 <span class="owner-tag design">需要交付</span></h3>
<ul>
<li>每个普通骰组合的行为说明:奖励、倍率、提示、是否触发 Lucky Dice。</li>
<li>chest / bomb / key 的完整玩法语义、奖励结算和失败/退出规则。</li>
<li>Slap Down / Treasure Heist 的完整短玩法规则。</li>
<li>活动期、新手期、冷却、保底、互斥、兜底等运营权重策略。</li>
</ul>
</article>
<article class="owner-card">
<h3>程序/联调 <span class="owner-tag dev">承接方式</span></h3>
<ul>
<li>当前 core 已能输出 Roll、规则、Lucky Dice 选择和目标模式结果。</li>
<li>优先把策划意图配置到现有 matcher/action 体系。</li>
<li>接入美术时间轴与资源,形成真实 Lucky Dice 表现层。</li>
<li>只有现有通用 action 无法表达时,才新增新的通用 executor。</li>
</ul>
</article>
</div>
</section>
<section class="preview" aria-label="animation rhythm preview">
<div class="preview-title">LUCKY DICE</div>
<div class="preview-board">
<div class="slot"></div>
<div class="slot"></div>
<div class="slot"></div>
</div>
<div class="preview-tray"></div>
<div class="die">1</div>
<div class="die">2</div>
<div class="die">3</div>
<div class="reward">ROCKET REWARD</div>
</section>
<section id="flow" class="section">
<h2>当前核心链路</h2>
<div class="grid-3">
<div class="panel"><h3>普通 Roll</h3><p><code>DiceRollService</code> 按配置生成普通骰,<code>ComboFactBuilder</code> 转成结构化组合事实。</p></div>
<div class="panel"><h3>规则与 action</h3><p><code>ComboRuleMatcher</code> 按优先级命中规则,<code>RollActionDispatcher</code> 按 action type 执行。</p></div>
<div class="panel"><h3>Lucky Dice</h3><p>双 Clover 触发候选筛选与权重随机,生成 3 格结果,再解析目标模式。</p></div>
</div>
<table>
<thead><tr><th>场景</th><th>当前配置结果</th><th>后续需要提供</th></tr></thead>
<tbody>
<tr><td>数字 + 数字</td><td>普通奖励</td><td>真实奖励池、倍率、飞入表现。</td></tr>
<tr><td>数字 + Clover</td><td>普通奖励 + Clover bonus</td><td>bonus 数值、文案、特效、音效。</td></tr>
<tr><td>Clover + Clover</td><td>触发 Lucky Dice</td><td>完整双四叶草爆发、标题、托盘、三骰入场动画。</td></tr>
<tr><td>rocket</td><td><code>slap_down_normal</code></td><td>Slap Down 完整短玩法规则和表现。</td></tr>
<tr><td>thief</td><td><code>treasure_heist_normal</code></td><td>Treasure Heist 完整短玩法规则和表现。</td></tr>
</tbody>
</table>
</section>
<section id="reference" class="section">
<h2>主流程帧图:双四叶草到 Slap Down</h2>
<div class="grid">
<figure><img src="frames/main_01_double_clover.jpg" alt="双四叶草落定"><figcaption>1. 双四叶草停在 DIG 按钮上方,仍保留地图状态和金币倍率。</figcaption></figure>
<figure><img src="frames/main_02_clover_burst.jpg" alt="四叶草粒子爆发"><figcaption>2. 背景压暗,绿色四叶草从中心向外爆发,先确认稀有触发。</figcaption></figure>
<figure><img src="frames/main_03_title_flash.jpg" alt="Lucky Dice 标题闪光"><figcaption>3. 标题用强黄光和两颗四叶草骰做入口识别。</figcaption></figure>
<figure><img src="frames/main_04_board_rise.jpg" alt="三格结果栏和托盘入场"><figcaption>4. 三格结果栏和红色托盘同时入场,顶部显示当前倍率。</figcaption></figure>
<figure><img src="frames/main_05_dice_enter.jpg" alt="三颗特殊骰飞入"><figcaption>5. 三颗特殊骰从屏幕边缘飞入,轨迹用金色粒子强调随机感。</figcaption></figure>
<figure><img src="frames/main_06_roll_mid.jpg" alt="骰子中段滚动"><figcaption>6. 骰子在托盘上滚动,结果栏暂时保持空位,悬念集中在三格。</figcaption></figure>
<figure><img src="frames/main_07_roll_settle.jpg" alt="骰子落稳"><figcaption>7. 骰子落稳,开始准备逐格点亮。</figcaption></figure>
<figure><img src="frames/main_08_first_lock.jpg" alt="第一格锁定"><figcaption>8. 第一个结果被金色垂线拉入左槽,槽位高亮。</figcaption></figure>
<figure><img src="frames/main_09_final_lock.jpg" alt="三个火箭结果锁定"><figcaption>9. 三格全部锁定为火箭,明确奖励类型。</figcaption></figure>
<figure><img src="frames/main_10_reward_launch.jpg" alt="火箭奖励飞出"><figcaption>10. 火箭奖励从托盘中心飞出并撒彩带,完成奖励兑现。</figcaption></figure>
<figure><img src="frames/main_11_transition_title.jpg" alt="Slap Down 转场标题"><figcaption>11. 白色烟尘转场,进入 <code>SLAP DOWN</code> 标题。</figcaption></figure>
<figure><img src="frames/main_12_target_mode.jpg" alt="Slap Down 玩法场景"><figcaption>12. 目标玩法落地到实验室场景,奖励动画没有停在结算面板。</figcaption></figure>
</div>
</section>
<section id="variants" class="section">
<h2>变体对比</h2>
<table>
<thead><tr><th>来源</th><th>倍率 / 结果</th><th>流程差异</th><th>对 FishDice 的要求</th></tr></thead>
<tbody>
<tr><td>新手1 44.0s - 58.0s</td><td>x1 / 三火箭 / Slap Down</td><td>地图挖掘自然触发,火箭结果可复用。</td><td>rocket 需要完整 Slap Down 内容和入口表现。</td></tr>
<tr><td>新手1 119.8s - 131.5s</td><td>x1 / 盗贼 / Treasure Heist</td><td>同一容器换结果图标和目标玩法,三格结构不变。</td><td>thief 需要完整 Treasure Heist 内容和入口表现。</td></tr>
<tr><td>新手2 147.0s - 158.0s</td><td>x3 / 三火箭</td><td>活动场景触发,背景不同但弹窗层级沿用。</td><td>触发源要可复用,不只绑定普通地图骰子。</td></tr>
<tr><td>新手2 444.0s - 455.0s</td><td>x20 / 盗贼 / Treasure Heist</td><td>从日常奖励弹窗叠出双四叶草。</td><td>运营活动和弹窗源也要能进入同一 Lucky Dice 表现层。</td></tr>
</tbody>
</table>
<h3>Slap Down 变体</h3>
<div class="grid">
<figure><img src="frames/variant_a_01_double_clover.jpg" alt="早期双四叶草"><figcaption>双四叶草落定。</figcaption></figure>
<figure><img src="frames/variant_a_02_board.jpg" alt="早期 Lucky Dice 入口"><figcaption>进入 Lucky Dice 入口。</figcaption></figure>
<figure><img src="frames/variant_a_03_locking.jpg" alt="早期火箭锁定"><figcaption>火箭结果逐格锁定。</figcaption></figure>
<figure><img src="frames/variant_a_04_complete.jpg" alt="早期火箭完成"><figcaption>三火箭完成。</figcaption></figure>
<figure><img src="frames/variant_a_05_slap_down.jpg" alt="早期 Slap Down"><figcaption>转入 Slap Down。</figcaption></figure>
</div>
<h3>Treasure Heist 与倍率变体</h3>
<div class="grid">
<figure><img src="frames/variant_b_01_clover_burst.jpg" alt="Treasure 变体双四叶草"><figcaption>Treasure 变体双四叶草落定。</figcaption></figure>
<figure><img src="frames/variant_b_03_locking.jpg" alt="Treasure 变体锁定"><figcaption>盗贼结果开始锁定。</figcaption></figure>
<figure><img src="frames/variant_b_05_transition.jpg" alt="Treasure Heist 转场"><figcaption>转入 Treasure Heist。</figcaption></figure>
<figure><img src="frames/variant_c_03_board.jpg" alt="x3 盘面"><figcaption>x3 三格盘面。</figcaption></figure>
<figure><img src="frames/variant_d_03_board.jpg" alt="x20 盘面"><figcaption>x20 三格盘面。</figcaption></figure>
<figure><img src="frames/variant_d_06_transition.jpg" alt="x20 Treasure Heist"><figcaption>x20 转入 Treasure Heist。</figcaption></figure>
</div>
</section>
<section id="base-assets" class="section">
<div class="section-title-row">
<h2>基础素材对照清单</h2>
<span class="owner-tag art">美术/UI 阻塞输入</span>
</div>
<div class="callout">
这部分不是“完整动画”的大项,而是所有动画和界面都依赖的底层素材。可以按参考帧逐项对齐:先把基础 UI、骰子部件、图标和状态补齐程序再把它们接入现有 core 输出。
</div>
<table class="blocking-table compare-table">
<thead><tr><th>分类</th><th>参考帧</th><th>参考里有什么</th><th>FishDice 需要提供</th><th>当前差距</th></tr></thead>
<tbody>
<tr>
<td>普通骰面</td>
<td><code>main_01</code><br><code>variant_c_01</code></td>
<td>两颗 Clover 停在 DIG 按钮上方,仍保留地图、金币倍率和普通骰落点关系。</td>
<td>普通骰体、2/3/4/5/6/Clover 六类面、落定态、高亮态、禁用或遮罩态。</td>
<td><span class="gap-tag">缺正式骰面</span><span class="gap-tag">缺骰体材质</span></td>
</tr>
<tr>
<td>基础 UI 界面</td>
<td><code>main_02</code><br><code>main_03</code></td>
<td>触发后先压暗背景,再用 Lucky Dice 大标题、强黄光和两颗 Clover 做入口识别。</td>
<td>全屏 dim mask、标题字、标题光效、入口装饰、弹入/闪白/淡出时序。</td>
<td><span class="gap-tag">缺触发界面</span><span class="gap-tag">缺标题资源</span></td>
</tr>
<tr>
<td>结果栏 UI</td>
<td><code>main_04</code><br><code>variant_d_03</code></td>
<td>金边三格槽、顶部倍率 x1/x3/x20、空槽、锁定槽和高亮槽都在同一个结构里。</td>
<td>三格结果栏 prefab、倍率牌、空槽/滚动/锁定/完成四种状态、槽位高亮特效。</td>
<td><span class="gap-tag">core 有 slotCount</span><span class="gap-tag">缺 UI 资产</span></td>
</tr>
<tr>
<td>托盘/容器</td>
<td><code>main_04</code><br><code>main_06</code></td>
<td>红色托盘作为三颗 Lucky Dice 的滚动容器,带厚度、阴影和中心舞台感。</td>
<td>红色托盘底图或模型、托盘阴影、骰子落点参考、入场/抬升/停留动画。</td>
<td><span class="gap-tag">缺托盘</span><span class="gap-tag">缺落点规范</span></td>
</tr>
<tr>
<td>Lucky 特殊骰</td>
<td><code>main_05</code><br><code>main_07</code></td>
<td>三颗特殊骰从屏幕边缘飞入,在托盘中滚动,最终停在可读面。</td>
<td>特殊骰体、特殊面贴图、飞入轨迹粒子、滚动帧、抖动帧、停稳帧。</td>
<td><span class="gap-tag">缺特殊骰体</span><span class="gap-tag">缺飞入轨迹</span></td>
</tr>
<tr>
<td>结果图标</td>
<td><code>main_09</code><br><code>variant_b_03</code></td>
<td>rocket/thief 图标进入三格槽后逐格锁定,图标决定后续目标玩法。</td>
<td>rocket、thief、chest、bomb、key 五类结果图标,含普通态、锁定态、飞出态。</td>
<td><span class="gap-tag">缺 chest/bomb/key</span><span class="gap-tag">缺状态图</span></td>
</tr>
<tr>
<td>奖励飞出</td>
<td><code>main_10</code><br><code>variant_b_04</code></td>
<td>结果从托盘中心飞出,同时出现彩带、金币和奖励强调。</td>
<td>奖励容器、飞出路径、彩带/金币粒子、命中特效、飞向目标入口的收束点。</td>
<td><span class="gap-tag">缺飞出资源</span><span class="gap-tag">缺路径点</span></td>
</tr>
<tr>
<td>白烟转场</td>
<td><code>main_11</code><br><code>variant_d_06</code></td>
<td>白烟遮挡旧界面,露出 Slap Down 或 Treasure Heist 的目标玩法标题。</td>
<td>白烟 VFX、目标玩法 title card、转场遮罩、进入玩法前后的保留/销毁规则。</td>
<td><span class="gap-tag">缺转场 VFX</span><span class="gap-tag">缺标题卡</span></td>
</tr>
<tr>
<td>目标玩法 UI</td>
<td><code>main_12</code><br><code>variant_a_05</code></td>
<td>转入实验室/目标玩法场景,不停留在 Lucky Dice 结算面板。</td>
<td>Slap Down、Treasure Heist、chest、bomb、key 对应玩法 UI、按钮、结算和返回入口。</td>
<td><span class="gap-tag">缺短玩法 UI</span><span class="gap-tag">缺规则定义</span></td>
</tr>
</tbody>
</table>
</section>
<section id="art" class="section">
<div class="section-title-row">
<h2>美术资产清单</h2>
<span class="owner-tag art">美术阻塞输入</span>
</div>
<div class="notes">
<div class="note"><strong>触发确认先于结果。</strong><br>双四叶草不是直接给奖励,而是先压暗、四叶草粒子爆发、标题闪光,告诉玩家稀有事件已发生。</div>
<div class="note"><strong>三格结构稳定。</strong><br>无论 x1、x3、x20三颗特殊骰和三格锁定不变倍率只改变价值感。</div>
<div class="note"><strong>结果强绑定下一玩法。</strong><br>三火箭进入 Slap Down盗贼进入 Treasure Heist奖励不是停在结算面板。</div>
</div>
<h3>必须提供</h3>
<table class="blocking-table">
<thead><tr><th>模块</th><th>资产</th><th>规格</th><th>命名建议</th></tr></thead>
<tbody>
<tr><td>基础 UI</td><td>全屏背景压暗层</td><td>触发 Lucky Dice 时覆盖当前地图或活动界面</td><td><code>ui_lucky_dim_mask</code></td></tr>
<tr><td>基础 UI</td><td>倍率牌</td><td>x1/x3/x20可扩展更多倍率</td><td><code>ui_lucky_multiplier_badge</code></td></tr>
<tr><td>普通骰子</td><td>数字骰面</td><td>2/3/4/5/6</td><td><code>dice_face_2</code><code>dice_face_6</code></td></tr>
<tr><td>普通骰子</td><td>基础骰体</td><td>普通 Roll 使用,需支持数字面和 Clover 面贴图</td><td><code>dice_body_normal</code></td></tr>
<tr><td>普通骰子</td><td>Clover 骰面</td><td>普通骰面中的特殊面</td><td><code>dice_face_clover</code></td></tr>
<tr><td>触发表现</td><td>绿色四叶草爆发</td><td>压暗背景 + 中心爆发 + 四叶草粒子</td><td><code>vfx_double_clover_burst</code></td></tr>
<tr><td>Lucky Dice</td><td>标题与强黄光</td><td>Lucky Dice 标题、闪光、两颗 Clover 标识</td><td><code>ui_lucky_dice_title</code></td></tr>
<tr><td>Lucky Dice</td><td>三格结果栏</td><td>固定 3 格,支持倍率显示</td><td><code>ui_lucky_result_board</code></td></tr>
<tr><td>Lucky Dice</td><td>红色托盘</td><td>托盘入场、骰子滚动承载</td><td><code>ui_lucky_dice_tray</code></td></tr>
<tr><td>Lucky Dice</td><td>特殊骰体</td><td>三颗 Lucky Dice 使用,需支持飞入、滚动、落稳</td><td><code>dice_body_lucky</code></td></tr>
<tr><td>Lucky Dice</td><td>特殊结果图标</td><td>rocket/thief/chest/bomb/key</td><td><code>lucky_result_rocket</code></td></tr>
<tr><td>奖励表现</td><td>奖励飞出容器</td><td>结果从托盘中心飞出,支持金币/道具/玩法入口</td><td><code>ui_lucky_reward_flyout</code></td></tr>
<tr><td>转场</td><td>白烟转场</td><td>从结果奖励飞出到目标玩法标题</td><td><code>vfx_lucky_mode_transition</code></td></tr>
</tbody>
</table>
</section>
<section id="design" class="section">
<div class="section-title-row">
<h2>策划配置清单</h2>
<span class="owner-tag design">策划阻塞输入</span>
</div>
<table class="blocking-table">
<thead><tr><th>表/配置</th><th>当前值或需要提供</th><th>说明</th></tr></thead>
<tbody>
<tr><td><code>DiceSetConfig</code></td><td><code>normal_main</code>2 颗,面池 <code>2,3,4,5,6,clover</code></td><td>普通骰数量和面池必须来自配置。</td></tr>
<tr><td><code>ComboRuleConfig</code></td><td><code>clover_clover -> trigger_lucky_dice</code></td><td>双 Clover 的优先级要高于普通奖励。</td></tr>
<tr><td><code>LuckyDiceCandidateConfig</code></td><td>result、target、slot、weight、enabled、sourceFilter、default</td><td>现有 rocket/thief 只是默认样例。</td></tr>
<tr><td><code>TargetModeConfig</code></td><td><code>rocket -> slap_down_normal</code><code>thief -> treasure_heist_normal</code></td><td>chest/bomb/key 也需要对应目标模式。</td></tr>
<tr><td>完整结果玩法</td><td><code>chest/bomb/key</code> 的规则、奖励、失败/退出、表现需求</td><td>当前 core 能接候选,但语义还缺策划定义。</td></tr>
<tr><td>短玩法规则</td><td>Slap Down / Treasure Heist 的入口、胜负、操作、结算、回主循环</td><td>当前只解析到 modeKey还不是完整短玩法。</td></tr>
</tbody>
</table>
<h3>复杂运营权重策略</h3>
<div class="grid-3">
<div class="panel"><h3>活动期权重</h3><p>活动 ID、起止条件、哪些 <code>resultKey</code> 提权、权重变化值。</p></div>
<div class="panel"><h3>新手期策略</h3><p>第几次 Roll 固定结果、何时开放随机、教程模式如何映射。</p></div>
<div class="panel"><h3>冷却与保底</h3><p>冷却时间、次数限制、连续未命中特殊结果后的提权或强制命中。</p></div>
</div>
</section>
<section id="core" class="section">
<h2>当前 Core 实现说明</h2>
<div class="grid-2">
<div class="path-block">LuckyDiceRuntimeFactory
-> DiceRollService
-> ComboRuleMatcher
-> RollActionDispatcher
-> LuckyDiceFlowService
-> TargetModeResolver</div>
<div class="panel">
<h3>实现边界</h3>
<p>外部调用 <code>LuckyDiceRollFlowService.Execute()</code> 得到完整 <code>RollFlowResult</code>。当前 Demo 使用文字模拟骰面和结果,没有接正式动画、音效或目标玩法场景。</p>
<p>程序侧仍优先把策划意图配置到现有 matcher/action 体系中,确实无法表达时才新增通用 executor。</p>
</div>
</div>
<div class="callout">当前 core 已够承载下一阶段开发。后续不是继续扩文字 demo而是接入美术时序、真实资源、结果配置和短玩法内容。</div>
</section>
<section id="next" class="section">
<h2>下一阶段需要收齐</h2>
<ul class="checklist">
<li><span class="owner-tag art">美术</span> 基础 UI 套件背景遮罩、Lucky Dice 标题、倍率牌、三格槽、红色托盘、奖励飞出容器、目标玩法标题卡。</li>
<li><span class="owner-tag art">美术</span> 骰子基础部件普通骰体、特殊骰体、2/3/4/5/6/Clover 面、rocket/thief/chest/bomb/key 特殊面和锁定状态。</li>
<li><span class="owner-tag art">美术</span> 完整复刻竞品的托盘、骰子飞入、白烟、粒子爆发、逐格锁定、奖励飞出全套动画拆解与资源。</li>
<li><span class="owner-tag art">美术</span> rocket / thief / chest / bomb / key 的结果图标、命中特效、奖励飞出和目标玩法转场表现。</li>
<li><span class="owner-tag design">策划</span> <code>chest/bomb/key</code> 的完整玩法内容、入口配置、奖励结算和表现需求。</li>
<li><span class="owner-tag design">策划</span> 复杂运营权重策略,包括活动期、新手期、冷却、保底、互斥和兜底。</li>
<li><span class="owner-tag design">策划</span> Slap Down / Treasure Heist 的完整短玩法规则,而不仅是 <code>modeKey</code></li>
<li><span class="owner-tag design">策划</span> 每个普通骰组合的行为需求说明,包括奖励、倍率、提示、是否触发 Lucky Dice。</li>
<li><span class="owner-tag dev">程序/联调</span> 触发源复用要求:主地图骰子、活动场景、日常奖励弹窗都应能叠出同一 Lucky Dice 表现层。</li>
<li><span class="owner-tag dev">程序/联调</span> 将策划配置与美术时间轴接入现有 core补必要的通用 executor 和表现层控制器。</li>
</ul>
</section>
</main>
<footer>
页面路径:<code>FishDice/Docs/Handoff/lucky-dice-assets-config-checklist.html</code>。参考帧图来自 <code>C:/Users/13999/Desktop/dig_roll_flow/frames</code>,已复制到当前 handoff 目录。
</footer>
</body>
</html>