docs(demo): 添加 Lucky Dice 资源交接清单
BIN
FishDice/Docs/Handoff/assets/big-fish-hidden-ui-effect.png
Normal file
|
After Width: | Height: | Size: 2.5 MiB |
|
After Width: | Height: | Size: 2.5 MiB |
|
After Width: | Height: | Size: 2.4 MiB |
BIN
FishDice/Docs/Handoff/assets/giant-shadow-drag-denoised.png
Normal file
|
After Width: | Height: | Size: 2.6 MiB |
BIN
FishDice/Docs/Handoff/frames/main_01_double_clover.jpg
Normal file
|
After Width: | Height: | Size: 95 KiB |
BIN
FishDice/Docs/Handoff/frames/main_02_clover_burst.jpg
Normal file
|
After Width: | Height: | Size: 102 KiB |
BIN
FishDice/Docs/Handoff/frames/main_03_title_flash.jpg
Normal file
|
After Width: | Height: | Size: 75 KiB |
BIN
FishDice/Docs/Handoff/frames/main_04_board_rise.jpg
Normal file
|
After Width: | Height: | Size: 122 KiB |
BIN
FishDice/Docs/Handoff/frames/main_05_dice_enter.jpg
Normal file
|
After Width: | Height: | Size: 146 KiB |
BIN
FishDice/Docs/Handoff/frames/main_06_roll_mid.jpg
Normal file
|
After Width: | Height: | Size: 125 KiB |
BIN
FishDice/Docs/Handoff/frames/main_07_roll_settle.jpg
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
FishDice/Docs/Handoff/frames/main_08_first_lock.jpg
Normal file
|
After Width: | Height: | Size: 128 KiB |
BIN
FishDice/Docs/Handoff/frames/main_09_final_lock.jpg
Normal file
|
After Width: | Height: | Size: 126 KiB |
BIN
FishDice/Docs/Handoff/frames/main_10_reward_launch.jpg
Normal file
|
After Width: | Height: | Size: 122 KiB |
BIN
FishDice/Docs/Handoff/frames/main_11_transition_title.jpg
Normal file
|
After Width: | Height: | Size: 65 KiB |
BIN
FishDice/Docs/Handoff/frames/main_12_target_mode.jpg
Normal file
|
After Width: | Height: | Size: 108 KiB |
BIN
FishDice/Docs/Handoff/frames/variant_a_01_double_clover.jpg
Normal file
|
After Width: | Height: | Size: 91 KiB |
BIN
FishDice/Docs/Handoff/frames/variant_a_02_board.jpg
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
FishDice/Docs/Handoff/frames/variant_a_03_locking.jpg
Normal file
|
After Width: | Height: | Size: 125 KiB |
BIN
FishDice/Docs/Handoff/frames/variant_a_04_complete.jpg
Normal file
|
After Width: | Height: | Size: 121 KiB |
BIN
FishDice/Docs/Handoff/frames/variant_a_05_slap_down.jpg
Normal file
|
After Width: | Height: | Size: 63 KiB |
BIN
FishDice/Docs/Handoff/frames/variant_b_01_clover_burst.jpg
Normal file
|
After Width: | Height: | Size: 106 KiB |
BIN
FishDice/Docs/Handoff/frames/variant_b_02_board.jpg
Normal file
|
After Width: | Height: | Size: 113 KiB |
BIN
FishDice/Docs/Handoff/frames/variant_b_03_locking.jpg
Normal file
|
After Width: | Height: | Size: 127 KiB |
BIN
FishDice/Docs/Handoff/frames/variant_b_04_reward.jpg
Normal file
|
After Width: | Height: | Size: 127 KiB |
BIN
FishDice/Docs/Handoff/frames/variant_b_05_transition.jpg
Normal file
|
After Width: | Height: | Size: 118 KiB |
BIN
FishDice/Docs/Handoff/frames/variant_c_01_double_clover.jpg
Normal file
|
After Width: | Height: | Size: 145 KiB |
BIN
FishDice/Docs/Handoff/frames/variant_c_02_clover_burst.jpg
Normal file
|
After Width: | Height: | Size: 111 KiB |
BIN
FishDice/Docs/Handoff/frames/variant_c_03_board.jpg
Normal file
|
After Width: | Height: | Size: 139 KiB |
BIN
FishDice/Docs/Handoff/frames/variant_c_04_lock.jpg
Normal file
|
After Width: | Height: | Size: 137 KiB |
BIN
FishDice/Docs/Handoff/frames/variant_c_05_launch.jpg
Normal file
|
After Width: | Height: | Size: 125 KiB |
BIN
FishDice/Docs/Handoff/frames/variant_d_01_daily_overlay.jpg
Normal file
|
After Width: | Height: | Size: 117 KiB |
BIN
FishDice/Docs/Handoff/frames/variant_d_02_title.jpg
Normal file
|
After Width: | Height: | Size: 103 KiB |
BIN
FishDice/Docs/Handoff/frames/variant_d_03_board.jpg
Normal file
|
After Width: | Height: | Size: 147 KiB |
BIN
FishDice/Docs/Handoff/frames/variant_d_04_locking.jpg
Normal file
|
After Width: | Height: | Size: 154 KiB |
BIN
FishDice/Docs/Handoff/frames/variant_d_05_complete.jpg
Normal file
|
After Width: | Height: | Size: 147 KiB |
BIN
FishDice/Docs/Handoff/frames/variant_d_06_transition.jpg
Normal file
|
After Width: | Height: | Size: 70 KiB |
823
FishDice/Docs/Handoff/lucky-dice-assets-config-checklist.html
Normal file
@@ -0,0 +1,823 @@
|
||||
<!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>
|
||||
367
FishDice/Docs/Handoff/lucky-dice-assets-config-checklist.md
Normal file
@@ -0,0 +1,367 @@
|
||||
# Lucky Dice 资产与配置交付清单
|
||||
|
||||
## 文档目的
|
||||
|
||||
这份清单用于对齐美术、策划和程序在 Lucky Dice 第一版中的交付边界:
|
||||
|
||||
- 美术同学需要提供哪些可落地资产。
|
||||
- 策划同学需要提供哪些规则、权重和玩法入口配置。
|
||||
- 程序当前 core 已经如何实现,接下来完整开发还需要哪些外部输入。
|
||||
|
||||
当前实现以 `LuckyDiceRollFlowService` 为核心入口,Demo 表现层只做最小 UI 演示。也就是说,core 骨架已经足够承接后续开发;接下来重点不是继续扩 demo core,而是让美术和策划补齐完整表现、完整特殊结果、运营策略和目标短玩法内容。
|
||||
|
||||
## 当前玩法闭环
|
||||
|
||||
第一版核心链路如下:
|
||||
|
||||
```text
|
||||
玩家触发普通 Roll
|
||||
-> DiceRollService 生成普通骰子结果
|
||||
-> ComboFactBuilder 生成组合事实
|
||||
-> ComboRuleMatcher 按优先级命中组合规则
|
||||
-> RollActionDispatcher 执行 action
|
||||
-> 如果 action 触发 Lucky Dice
|
||||
-> LuckyDiceFlowService 筛选候选并按权重随机
|
||||
-> 生成 Lucky Dice 结果槽
|
||||
-> TargetModeResolver 解析目标玩法模式
|
||||
-> 输出 EnterTargetModeEffect 给表现层或目标玩法入口
|
||||
```
|
||||
|
||||
当前默认结果:
|
||||
|
||||
| 场景 | 当前配置结果 |
|
||||
| --- | --- |
|
||||
| 数字 + 数字 | 普通奖励 |
|
||||
| 数字 + clover | 普通奖励 + Clover bonus |
|
||||
| clover + clover | 触发 Lucky Dice |
|
||||
| Lucky Dice 选中 rocket | 进入 `slap_down_normal` |
|
||||
| Lucky Dice 选中 thief | 进入 `treasure_heist_normal` |
|
||||
|
||||
## 美术资产清单
|
||||
|
||||
### 第一版必须提供
|
||||
|
||||
| 模块 | 资产 | 数量/规格 | 用途 | 命名建议 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 普通骰子 | 数字骰面 | 5 个,数字 `2/3/4/5/6` | 普通 Roll 展示 | `dice_face_2` 到 `dice_face_6` |
|
||||
| 普通骰子 | Clover 骰面 | 1 个 | 触发 bonus 或 Lucky Dice | `dice_face_clover` |
|
||||
| Lucky Dice | Rocket 结果图标 | 1 个 | 表示进入 Slap Down | `lucky_result_rocket` |
|
||||
| Lucky Dice | Thief 结果图标 | 1 个 | 表示进入 Treasure Heist | `lucky_result_thief` |
|
||||
| Lucky Dice | 结果槽底板 | 1 套,可复用 3 格 | 当前显示 3 个相同结果槽 | `lucky_slot_frame` |
|
||||
| UI | Lucky Dice 标题区 | 1 套 | 进入特殊流程时显示标题 | `lucky_title_panel` |
|
||||
| UI | 倍率/奖励文案底板 | 1 套 | 显示倍率、奖励或结果反馈 | `lucky_reward_panel` |
|
||||
| UI | 普通投骰按钮状态 | 至少 3 态 | 待投、投掷中、再投一次 | `btn_roll_normal/default/disabled` |
|
||||
| UI | 特殊结果揭示状态 | 至少 1 套 | Lucky Dice 结果亮相 | `lucky_reveal_state` |
|
||||
|
||||
### 第一版建议提供
|
||||
|
||||
| 模块 | 资产 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| 转场 | 普通 Roll 命中 Lucky Dice 的轻量转场 | 不需要复杂白烟或飞入,先提供短过渡即可 |
|
||||
| 反馈 | Clover bonus 的小特效 | 用于区分数字 + clover 和普通奖励 |
|
||||
| 反馈 | Lucky Dice 命中特殊结果的高亮 | 结果槽定格时使用 |
|
||||
| 音效 | 普通骰子滚动音效 | 可先 1 个循环或短音 |
|
||||
| 音效 | Lucky Dice 揭示音效 | 结果揭示时播放 |
|
||||
| 音效 | 进入目标玩法音效 | `rocket/thief` 跳转前反馈 |
|
||||
|
||||
### 后续扩展预留
|
||||
|
||||
| 扩展方向 | 资产需求 |
|
||||
| --- | --- |
|
||||
| 新 Lucky Dice 结果 | `chest/bomb/key` 等图标、命中特效、入口反馈 |
|
||||
| 结果槽数量变化 | 2 格、4 格或动态布局适配资源 |
|
||||
| 更复杂动画 | 托盘、骰子飞入、粒子爆发、白烟转场、镜头震动 |
|
||||
| 教程/Bonus 模式 | 教程标识、bonus 标识、特殊状态底板 |
|
||||
| 目标玩法落地 | Slap Down、Treasure Heist 各自入口插画或短玩法 UI |
|
||||
|
||||
### 完整表现开发需要提供
|
||||
|
||||
这些不是当前 demo core 的必需项,但属于下一阶段完整开发前必须向美术收齐的输入。
|
||||
|
||||
| 模块 | 资产/说明 | 需要确认 |
|
||||
| --- | --- | --- |
|
||||
| 托盘动画 | Lucky Dice 托盘出现、停留、退出的完整动画 | 时长、入场方向、层级、是否可跳过 |
|
||||
| 骰子飞入 | 普通骰或 Lucky Dice 结果飞入槽位的动画 | 起点、路径、缓动、落点反馈 |
|
||||
| 白烟转场 | 命中 Lucky Dice 或进入目标玩法前的白烟/遮罩转场 | 遮挡范围、时长、是否承接场景切换 |
|
||||
| 粒子爆发 | 命中特殊结果、Clover bonus、进入目标玩法的粒子 | 颜色、强度、触发节点 |
|
||||
| 全套时序参考 | 竞品完整动画拆帧或时间轴 | 每段开始/结束点、可交互锁定时间 |
|
||||
| 失败/兜底表现 | 候选池为空、目标模式缺失、普通奖励兜底的提示表现 | 是否展示给玩家、是否只进调试日志 |
|
||||
|
||||
## 策划配置清单
|
||||
|
||||
### 骰子集合配置
|
||||
|
||||
| 字段 | 当前值 | 说明 | 提供方 |
|
||||
| --- | --- | --- | --- |
|
||||
| `diceSetId` | `normal_main` | 普通骰子集合 ID | 策划 |
|
||||
| `setType` | `Normal` | 普通骰子集合 | 程序固定枚举,策划确认 |
|
||||
| `diceCount` | `2` | 普通 Roll 投几颗骰子 | 策划 |
|
||||
| `faces` | `2,3,4,5,6,clover` | 普通骰面池 | 策划确认,美术提供图 |
|
||||
| `diceSetId` | `lucky_dice` | Lucky Dice 集合 ID | 策划 |
|
||||
| `setType` | `Lucky` | 特殊结果集合 | 程序固定枚举,策划确认 |
|
||||
| `defaultResultSlotCount` | `3` | 特殊结果默认展示槽数 | 策划 |
|
||||
| `faces` | `rocket,thief` | 第一版特殊结果池 | 策划确认,美术提供图 |
|
||||
|
||||
### 普通组合规则配置
|
||||
|
||||
| 字段 | 当前示例 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| `ruleId` | `normal_clover_clover_lucky_dice` | 规则唯一 ID |
|
||||
| `priority` | `100` | 优先级,高的先匹配 |
|
||||
| `matcherType` | `ExactCombo` | 使用哪种匹配器 |
|
||||
| `comboKey` | `clover_clover` | 精确组合 key |
|
||||
| `actions` | `trigger_lucky_dice` | 命中后执行的行为 |
|
||||
| `stopAfterMatched` | `true` | 命中后是否停止后续规则 |
|
||||
|
||||
当前默认规则:
|
||||
|
||||
| 优先级 | 规则 | 行为 |
|
||||
| --- | --- | --- |
|
||||
| 100 | `clover_clover` | `trigger_lucky_dice` |
|
||||
| 50 | 包含 1 个 `clover` | `grant_reward` + `add_multiplier` |
|
||||
| 10 | 全部是数字 | `grant_reward` |
|
||||
|
||||
策划新增组合时,优先新增规则配置;只有现有 matcher 无法表达时才需要程序新增 matcher。
|
||||
|
||||
### 可用 matcher 类型
|
||||
|
||||
| matcher | 可表达内容 |
|
||||
| --- | --- |
|
||||
| `ExactCombo` | 精确匹配无序或有序组合 key |
|
||||
| `AllNumbers` | 所有骰子都是数字 |
|
||||
| `ContainsFace` | 包含指定骰面 |
|
||||
| `FaceCount` | 指定骰面数量等于某值 |
|
||||
| `FaceCountRange` | 指定骰面数量在区间内 |
|
||||
| `DiceCount` | 限定骰子数量 |
|
||||
| `NumberPair` | 数字对子 |
|
||||
| `NumberOfAKind` | N 个相同数字 |
|
||||
| `NumberSumRange` | 数字点数和区间 |
|
||||
|
||||
### 可用 action 类型
|
||||
|
||||
| action | 当前效果 | 需要策划提供的参数 |
|
||||
| --- | --- | --- |
|
||||
| `grant_reward` | 产出普通奖励效果 | 后续需要接真实奖励时补奖励 ID、数量、倍率策略 |
|
||||
| `add_multiplier` | 产出倍率效果 | 当前使用 `reason=clover_bonus` |
|
||||
| `trigger_lucky_dice` | 进入 Lucky Dice 流程 | 无 |
|
||||
|
||||
规格中预留了 `enter_mode` 和 `show_popup`,但当前默认执行器尚未实现;如果策划需要直接进玩法或弹提示,需要先补程序执行器。
|
||||
|
||||
### Lucky Dice 候选配置
|
||||
|
||||
| 字段 | 当前示例 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| `resultKey` | `rocket` | Lucky Dice 抽中的特殊结果 |
|
||||
| `targetKey` | `slap_down` | 目标玩法 ID |
|
||||
| `resultSlotCount` | `3` | 显示几个结果槽 |
|
||||
| `weight` | `1` | 权重随机用 |
|
||||
| `enabled` | `true` | 是否启用 |
|
||||
| `minLevel` | `0` | 最低玩家等级 |
|
||||
| `sourceFilter` | `normal_roll` | 允许从哪个来源触发 |
|
||||
| `isDefault` | `true` | 候选池兜底结果 |
|
||||
|
||||
当前默认候选:
|
||||
|
||||
| resultKey | targetKey | modeKey | slot | weight | default |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| `rocket` | `slap_down` | `slap_down_normal` | 3 | 1 | 是 |
|
||||
| `thief` | `treasure_heist` | `treasure_heist_normal` | 3 | 1 | 否 |
|
||||
|
||||
### 目标模式配置
|
||||
|
||||
| 字段 | 当前示例 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| `resultKey` | `rocket` | Lucky Dice 特殊结果 |
|
||||
| `targetKey` | `slap_down` | 目标玩法 |
|
||||
| `modeKey` | `slap_down_normal` | 具体进入模式 |
|
||||
|
||||
后续如果要支持新手教程、bonus 模式或活动模式,建议新增 mode 配置与解析规则,不要把分支写进 Lucky Dice 随机逻辑里。
|
||||
|
||||
### 完整结果与短玩法内容配置
|
||||
|
||||
这些内容是下一阶段开发需要策划提供的核心输入。
|
||||
|
||||
| 内容 | 需要提供 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| `chest` 完整玩法 | `resultKey`、`targetKey`、默认 `modeKey`、奖励规则、表现需求、失败/退出规则 | 当前 core 支持新增候选,但玩法语义需要策划定义 |
|
||||
| `bomb` 完整玩法 | 触发条件、目标玩法、奖励或惩罚、是否影响倍率、表现需求 | 需要明确是否只是入口还是独立短玩法 |
|
||||
| `key` 完整玩法 | 解锁对象、奖励池、目标玩法、与进度/关卡的关系 | 需要明确是否有库存、冷却或次数限制 |
|
||||
| Slap Down 短玩法规则 | 入口条件、胜负条件、交互方式、奖励结算、退出回主循环规则 | 当前只解析到 `slap_down_normal`,未实现短玩法内容 |
|
||||
| Treasure Heist 短玩法规则 | 入口条件、交互方式、奖励结算、失败处理、退出回主循环规则 | 当前只解析到 `treasure_heist_normal`,未实现短玩法内容 |
|
||||
| 组合行为说明 | 每个普通骰组合对应的玩家可感知结果、奖励、倍率、提示、是否进入 Lucky Dice | 程序仍优先映射到通用 action;只有出现新通用行为时才新增 executor |
|
||||
|
||||
### 复杂运营权重策略
|
||||
|
||||
当前 core 已有 `weight`、`enabled`、`minLevel`、`sourceFilter`,但复杂运营策略还需要策划补完整规则。
|
||||
|
||||
| 策略 | 需要提供 |
|
||||
| --- | --- |
|
||||
| 活动期权重 | 活动 ID、起止条件、哪些 `resultKey` 提权、权重变化值 |
|
||||
| 新手期策略 | 第几次 Roll 固定结果、何时开放随机、教程模式如何映射 |
|
||||
| 冷却策略 | 每个 `targetKey/resultKey` 的冷却时间、次数限制、跨局是否继承 |
|
||||
| 保底策略 | 连续未命中特殊结果几次后提升概率或强制命中 |
|
||||
| 互斥策略 | 哪些结果不能连续出现,哪些结果不能与当前关卡/活动共存 |
|
||||
| 兜底策略 | 候选池为空、权重全 0、模式缺失时给玩家什么结果 |
|
||||
|
||||
### 兜底与验收配置
|
||||
|
||||
策划需要确认以下策略:
|
||||
|
||||
| 问题 | 当前程序行为 | 需要确认 |
|
||||
| --- | --- | --- |
|
||||
| 普通组合未命中 | 目前规则覆盖默认 2 骰主要组合 | 未命中时是否发普通奖励兜底 |
|
||||
| Lucky Dice 候选过滤后为空 | 优先找过滤后 default;没有则 `NormalRewardFallback` | 是否允许回普通奖励 |
|
||||
| 候选权重都小于等于 0 | 不参与随机,走 default 或普通奖励兜底 | 是否需要配置校验直接报错 |
|
||||
| 目标模式缺失 | 返回 `TargetModeFailedEffect` | 是否弹错误、发普通奖励或阻断 |
|
||||
| 新增结果没有图标 | core 可出结果,但表现层无法正确展示 | 是否允许占位图 |
|
||||
|
||||
## 当前 core 实现说明
|
||||
|
||||
### 入口
|
||||
|
||||
`LuckyDiceRuntimeFactory.CreateDefaultFlow()` 创建默认运行时,注入:
|
||||
|
||||
- `DiceRollService`
|
||||
- `ComboRuleMatcher`
|
||||
- `RollActionDispatcher`
|
||||
- `LuckyDiceFlowService`
|
||||
- `TargetModeResolver`
|
||||
|
||||
外部只需要向 `LuckyDiceRollFlowService.Execute()` 传入 `RollFlowRequest`,就能得到完整 `RollFlowResult`。
|
||||
|
||||
### 普通 Roll
|
||||
|
||||
`DiceRollService` 根据 `DiceSetConfig.DiceCount` 投掷,不写死两颗骰子。`ComboFactBuilder` 会把普通结果转成:
|
||||
|
||||
- 原始 faces
|
||||
- `FaceCounts`
|
||||
- `NumberValues`
|
||||
- `NumberSum`
|
||||
- `CloverCount`
|
||||
- `NormalizedKey`
|
||||
- `OrderedKey`
|
||||
|
||||
普通组合匹配只处理 `DiceSetType.Normal`。如果把 Lucky Dice 特殊结果交给 `ComboFactBuilder`,测试已经覆盖会拒绝处理。
|
||||
|
||||
### 规则匹配
|
||||
|
||||
`ComboRuleMatcher` 按优先级匹配规则,matcher 由 `MatcherType` 注册。当前默认 matcher 已覆盖第一版和 N 骰扩展常用场景。
|
||||
|
||||
这意味着新增组合时通常只需要策划加配置,例如:
|
||||
|
||||
```text
|
||||
FaceCountRange clover min 2 -> trigger_lucky_dice
|
||||
NumberOfAKind count 3 -> grant_reward + add_multiplier
|
||||
```
|
||||
|
||||
### 行为执行
|
||||
|
||||
`RollActionDispatcher` 只按 `ActionType` 找 executor,不按 `clover_clover` 这类组合 key 找方法。
|
||||
|
||||
当前执行器只实现三类:
|
||||
|
||||
- `grant_reward`
|
||||
- `add_multiplier`
|
||||
- `trigger_lucky_dice`
|
||||
|
||||
如果未来要有弹窗、直接进玩法、发具体道具包,需要新增通用 executor,而不是给每个组合写独立方法。
|
||||
|
||||
### Lucky Dice 选择
|
||||
|
||||
`LuckyDiceFlowService.Select()` 当前做了三层筛选:
|
||||
|
||||
1. `enabled`
|
||||
2. `playerLevel >= minLevel`
|
||||
3. `sourceFilter` 包含当前 `TriggerSource`
|
||||
|
||||
筛选后按 `weight` 做随机。若没有可随机候选,会尝试 filtered 里的 `isDefault`;仍没有时返回普通奖励兜底标记 `NormalRewardFallback`。
|
||||
|
||||
当前实现还没有独立的 cooldown/tutorial filter 类,字段和规格已预留,后续要做时应在这里扩展筛选链。
|
||||
|
||||
### 结果槽
|
||||
|
||||
Lucky Dice 随机只选一个 `resultKey`。展示槽由配置生成:
|
||||
|
||||
```text
|
||||
slotCount = candidate.resultSlotCount
|
||||
?? luckyDiceSet.defaultResultSlotCount
|
||||
?? 3
|
||||
```
|
||||
|
||||
第一版会把同一个 `resultKey` 重复填满槽位,例如 `rocket, rocket, rocket`。
|
||||
|
||||
### 目标模式解析
|
||||
|
||||
`TargetModeResolver` 用 `resultKey + targetKey` 查 `TargetModeConfig`,得到最终 `modeKey`。
|
||||
|
||||
当前默认映射:
|
||||
|
||||
- `rocket + slap_down -> slap_down_normal`
|
||||
- `thief + treasure_heist -> treasure_heist_normal`
|
||||
|
||||
如果映射缺失,会返回 `MissingTargetMode`,不会静默吞掉。
|
||||
|
||||
### 表现层
|
||||
|
||||
`LuckyDiceDemoController` 是当前最小表现 demo:
|
||||
|
||||
- 运行时创建 Canvas。
|
||||
- 展示 2 个普通骰子文本。
|
||||
- 命中 Lucky Dice 时展示 3 个特殊结果槽。
|
||||
- 根据 `LuckyDiceDemoSnapshot` 显示组合、规则、效果和目标模式。
|
||||
|
||||
它现在使用文字模拟骰面和结果,尚未接入正式图片、动画、音效或目标玩法真实场景。
|
||||
|
||||
## 给美术和策划的交付格式建议
|
||||
|
||||
### 美术交付建议
|
||||
|
||||
```text
|
||||
Art/LuckyDice/
|
||||
DiceFaces/
|
||||
dice_face_2.png
|
||||
dice_face_3.png
|
||||
dice_face_4.png
|
||||
dice_face_5.png
|
||||
dice_face_6.png
|
||||
dice_face_clover.png
|
||||
LuckyResults/
|
||||
lucky_result_rocket.png
|
||||
lucky_result_thief.png
|
||||
UI/
|
||||
lucky_slot_frame.png
|
||||
lucky_title_panel.png
|
||||
lucky_reward_panel.png
|
||||
VFX/
|
||||
vfx_clover_bonus.prefab
|
||||
vfx_lucky_reveal.prefab
|
||||
Audio/
|
||||
sfx_dice_roll.wav
|
||||
sfx_lucky_reveal.wav
|
||||
sfx_target_enter.wav
|
||||
```
|
||||
|
||||
### 策划配置表建议
|
||||
|
||||
第一版建议拆成 4 张表或 4 个 JSON/ScriptableObject:
|
||||
|
||||
| 表 | 主键 | 内容 |
|
||||
| --- | --- | --- |
|
||||
| `DiceSetConfig` | `diceSetId` | 骰子集合、数量、面池、默认槽数 |
|
||||
| `ComboRuleConfig` | `ruleId` | 普通组合规则、优先级、matcher、actions |
|
||||
| `LuckyDiceCandidateConfig` | `resultKey + targetKey` | Lucky Dice 候选、权重、启用条件、槽数 |
|
||||
| `TargetModeConfig` | `resultKey + targetKey` | 目标玩法模式映射 |
|
||||
|
||||
程序当前已经有这些结构的本地默认版本;后续可以把默认硬编码迁移到 ScriptableObject 或 JSON。
|
||||
|
||||
## 下一阶段需要收齐
|
||||
|
||||
当前 demo core 已经足够验证基础链路。下一阶段如果要进入完整开发,需要美术和策划补齐以下内容:
|
||||
|
||||
- 完整复刻竞品的托盘、飞入、白烟、粒子爆发全套动画拆解与资源。
|
||||
- `chest/bomb/key` 的完整玩法内容、入口配置、奖励结算和表现需求。
|
||||
- 复杂运营权重策略,包括活动期、新手期、冷却、保底、互斥和兜底。
|
||||
- Slap Down / Treasure Heist 的完整短玩法规则,而不仅是 `modeKey`。
|
||||
- 每个普通骰组合的行为需求说明,包括奖励、倍率、提示、是否触发 Lucky Dice。
|
||||
|
||||
程序侧当前不建议为每个组合直接新增独立方法;策划需要提供的是“组合对应的玩法意图和参数”。程序会优先把这些意图配置到现有 matcher/action 体系中,只有现有通用 action 无法表达时,才新增新的通用 executor。
|
||||