prts-moonlit 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/assets/boy.jpg +0 -0
  2. package/assets/card.jpg +0 -0
  3. package/assets/crew.jpg +0 -0
  4. package/assets/face.jpg +0 -0
  5. package/assets/fig.jpg +0 -0
  6. package/assets/grn.jpg +0 -0
  7. package/assets/hero.jpg +0 -0
  8. package/assets/hero.png +0 -0
  9. package/assets/scene.jpg +0 -0
  10. package/assets/taro.jpg +0 -0
  11. package/assets/taro78/k00.jpg +0 -0
  12. package/assets/taro78/k01.jpg +0 -0
  13. package/assets/taro78/k02.jpg +0 -0
  14. package/assets/taro78/k03.jpg +0 -0
  15. package/assets/taro78/k04.jpg +0 -0
  16. package/assets/taro78/k05.jpg +0 -0
  17. package/assets/taro78/k06.jpg +0 -0
  18. package/assets/taro78/k07.jpg +0 -0
  19. package/assets/taro78/k08.jpg +0 -0
  20. package/assets/taro78/k09.jpg +0 -0
  21. package/assets/taro78/k10.jpg +0 -0
  22. package/assets/taro78/k11.jpg +0 -0
  23. package/assets/taro78/k12.jpg +0 -0
  24. package/assets/taro78/k13.jpg +0 -0
  25. package/assets/taro78/k14.jpg +0 -0
  26. package/assets/taro78/k15.jpg +0 -0
  27. package/assets/taro78/k16.jpg +0 -0
  28. package/assets/taro78/k17.jpg +0 -0
  29. package/assets/taro78/k18.jpg +0 -0
  30. package/assets/taro78/k19.jpg +0 -0
  31. package/assets/taro78/k20.jpg +0 -0
  32. package/assets/taro78/k21.jpg +0 -0
  33. package/assets/taro78/k22.jpg +0 -0
  34. package/assets/taro78/k23.jpg +0 -0
  35. package/assets/taro78/k24.jpg +0 -0
  36. package/assets/taro78/k25.jpg +0 -0
  37. package/assets/taro78/k26.jpg +0 -0
  38. package/assets/taro78/k27.jpg +0 -0
  39. package/assets/taro78/k28.jpg +0 -0
  40. package/assets/taro78/k29.jpg +0 -0
  41. package/assets/taro78/k30.jpg +0 -0
  42. package/assets/taro78/k31.jpg +0 -0
  43. package/assets/taro78/k32.jpg +0 -0
  44. package/assets/taro78/k33.jpg +0 -0
  45. package/assets/taro78/k34.jpg +0 -0
  46. package/assets/taro78/k35.jpg +0 -0
  47. package/assets/taro78/k36.jpg +0 -0
  48. package/assets/taro78/k37.jpg +0 -0
  49. package/assets/taro78/k38.jpg +0 -0
  50. package/assets/taro78/k39.jpg +0 -0
  51. package/assets/taro78/k40.jpg +0 -0
  52. package/assets/taro78/k41.jpg +0 -0
  53. package/assets/taro78/k42.jpg +0 -0
  54. package/assets/taro78/k43.jpg +0 -0
  55. package/assets/taro78/k44.jpg +0 -0
  56. package/assets/taro78/k45.jpg +0 -0
  57. package/assets/taro78/k46.jpg +0 -0
  58. package/assets/taro78/k47.jpg +0 -0
  59. package/assets/taro78/k48.jpg +0 -0
  60. package/assets/taro78/k49.jpg +0 -0
  61. package/assets/taro78/k50.jpg +0 -0
  62. package/assets/taro78/k51.jpg +0 -0
  63. package/assets/taro78/k52.jpg +0 -0
  64. package/assets/taro78/k53.jpg +0 -0
  65. package/assets/taro78/k54.jpg +0 -0
  66. package/assets/taro78/k55.jpg +0 -0
  67. package/assets/taro78/k56.jpg +0 -0
  68. package/assets/taro78/k57.jpg +0 -0
  69. package/assets/taro78/k58.jpg +0 -0
  70. package/assets/taro78/k59.jpg +0 -0
  71. package/assets/taro78/k60.jpg +0 -0
  72. package/assets/taro78/k61.jpg +0 -0
  73. package/assets/taro78/k62.jpg +0 -0
  74. package/assets/taro78/k63.jpg +0 -0
  75. package/assets/taro78/k64.jpg +0 -0
  76. package/assets/taro78/k65.jpg +0 -0
  77. package/assets/taro78/k66.jpg +0 -0
  78. package/assets/taro78/k67.jpg +0 -0
  79. package/assets/taro78/k68.jpg +0 -0
  80. package/assets/taro78/k69.jpg +0 -0
  81. package/assets/taro78/k70.jpg +0 -0
  82. package/assets/taro78/k71.jpg +0 -0
  83. package/assets/taro78/k72.jpg +0 -0
  84. package/assets/taro78/k73.jpg +0 -0
  85. package/assets/taro78/k74.jpg +0 -0
  86. package/assets/taro78/k75.jpg +0 -0
  87. package/assets/taro78/k76.jpg +0 -0
  88. package/assets/taro78/k77.jpg +0 -0
  89. package/bgm.mp3 +0 -0
  90. package/gacha.html +1043 -0
  91. package/index.html +2757 -0
  92. package/ledger.html +1003 -0
  93. package/package.json +6 -0
package/index.html ADDED
@@ -0,0 +1,2757 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover,user-scalable=no">
6
+ <meta name="apple-mobile-web-app-capable" content="yes">
7
+ <title>ARKNIGHTS × P3R · 月行水上</title>
8
+ <style>
9
+ /* ============ TOKENS ============ */
10
+ :root{
11
+ --bz:#2fa8ff; --bz-hi:#63c8ff; --bz-mid:#1478e2; --bz-deep:#0a44a8; --bz-night:#06184a;
12
+ --ink:#050b1c; --ink2:#0b1730;
13
+ --paper:#f2f8ff; --paper-dim:rgba(242,248,255,.62);
14
+ --cyan:#7fe9ff; --mag:#ff2e6e; --red:#ff2d3d; --lime:#d7f24a; --gold:#ffd469; --violet:#a06cff;
15
+ --line:rgba(255,255,255,.30);
16
+ --sh:0 6px 24px rgba(0,20,60,.45);
17
+ --fast:180ms;
18
+ }
19
+ *{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
20
+ html,body{margin:0;height:100%;overflow:hidden;background:#04091c}
21
+ body{
22
+ font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Hiragino Sans GB","Helvetica Neue",Arial,sans-serif;
23
+ color:var(--paper);user-select:none;-webkit-user-select:none;
24
+ font-size:clamp(12px,1.55vw,17px);
25
+ }
26
+ #app{position:fixed;inset:0;overflow:hidden}
27
+
28
+ /* ============ BACKGROUND SCENE ============ */
29
+ .bg{position:absolute;inset:0;background:
30
+ radial-gradient(ellipse 62% 34% at 50% 4%, rgba(130,205,255,.34), transparent 72%),
31
+ radial-gradient(ellipse 88% 48% at 50% 60%, rgba(28,108,220,.58), transparent 74%),
32
+ linear-gradient(180deg,#03102c 0%,#062763 40%,#0a3f8f 68%,#03102c 100%);}
33
+ .bg .grid{position:absolute;inset:0;opacity:.85;
34
+ background:repeating-conic-gradient(from 45deg at 50% 50%, rgba(140,210,255,.075) 0 25%, transparent 0 50%);
35
+ background-size:5.2vw 5.2vw;
36
+ -webkit-mask-image:linear-gradient(180deg,transparent 6%,#000 34%,#000 66%,transparent 96%);
37
+ mask-image:linear-gradient(180deg,transparent 6%,#000 34%,#000 66%,transparent 96%);}
38
+ .bg .arch{position:absolute;left:-20%;right:-20%;top:-26%;height:96%;
39
+ background:repeating-conic-gradient(from 172deg at 50% 0%, rgba(170,225,255,.20) 0 .45deg, transparent .45deg 2.6deg);
40
+ -webkit-mask-image:radial-gradient(ellipse 44% 60% at 50% 0%,#000 30%,transparent 78%);
41
+ mask-image:radial-gradient(ellipse 44% 60% at 50% 0%,#000 30%,transparent 78%);}
42
+ .bg .drape{position:absolute;inset:0;opacity:.55;
43
+ background:repeating-linear-gradient(90deg, rgba(0,0,0,.30) 0 5px, rgba(90,170,255,.09) 5px 9px, transparent 9px 30px);
44
+ -webkit-mask-image:linear-gradient(90deg,#000,transparent 30%,transparent 70%,#000);
45
+ mask-image:linear-gradient(90deg,#000,transparent 30%,transparent 70%,#000);}
46
+ .bg .stage{position:absolute;left:50%;top:56%;width:70vw;height:24vh;transform:translate(-50%,-50%);
47
+ border-radius:50%;
48
+ background:radial-gradient(ellipse at 50% 26%, rgba(120,190,255,.30), rgba(10,52,124,.34) 58%, transparent 78%);
49
+ filter:blur(5px);}
50
+ .bg .table{position:absolute;left:52%;top:61%;width:29vw;height:10vh;transform:translate(-50%,-50%);border-radius:50%;
51
+ background:radial-gradient(ellipse at 50% 24%, rgba(188,224,255,.55), rgba(58,116,186,.5) 58%, rgba(12,44,96,.44) 80%, transparent 88%);
52
+ box-shadow:0 6px 30px rgba(90,170,255,.22);opacity:.5;}
53
+ .bg .floor{position:absolute;left:0;right:0;bottom:0;height:38%;
54
+ background:linear-gradient(180deg,transparent, rgba(3,10,30,.72));}
55
+ .bg .vig{position:absolute;inset:0;
56
+ background:radial-gradient(ellipse 68% 60% at 50% 42%, transparent 34%, rgba(2,8,24,.80) 100%);}
57
+
58
+ /* ============ DECO LAYER ============ */
59
+ .deco{position:absolute;inset:0;overflow:hidden;pointer-events:none;z-index:2}
60
+ .bub{position:absolute;border-radius:50%;background:rgba(96,208,255,.72);
61
+ box-shadow:inset 0 -2px 6px rgba(255,255,255,.55), 0 0 14px rgba(70,190,255,.42);}
62
+ .bub.pet{border-radius:64% 36% 58% 42%/54% 48% 52% 46%;background:rgba(120,222,255,.62)}
63
+ .bub.pale{background:rgba(190,238,255,.55)}
64
+ .ray{position:absolute;height:2px;background:linear-gradient(90deg,transparent,rgba(255,255,255,.85),transparent);
65
+ transform:skewX(-24deg);opacity:.5}
66
+ .arc{position:absolute;border-radius:50%;border:1.5px solid rgba(160,225,255,.36)}
67
+
68
+ /* ============ HUD / TOP BAR ============ */
69
+ .hud{position:absolute;left:0;right:0;top:0;z-index:20;padding:max(8px,env(safe-area-inset-top)) 14px 8px;
70
+ display:flex;align-items:center;gap:10px}
71
+ .hud .icb{width:34px;height:34px;flex:0 0 auto;display:grid;place-items:center;
72
+ color:var(--paper);font-size:15px;border:1px solid rgba(255,255,255,.24);
73
+ background:rgba(6,22,56,.5);backdrop-filter:blur(6px);border-radius:3px;cursor:pointer}
74
+ .hud .icb:active{background:var(--bz-mid)}
75
+ .hud .clock{margin-left:auto;display:flex;flex-direction:column;align-items:flex-end;line-height:1.05}
76
+ .hud .clock b{font-size:clamp(15px,1.9vw,22px);font-weight:800;letter-spacing:.02em}
77
+ .hud .clock s{text-decoration:none;opacity:.72;font-size:.76em;letter-spacing:.06em}
78
+ .res{display:flex;align-items:center;gap:12px;margin-left:auto;flex-wrap:wrap;justify-content:flex-end}
79
+ .res .r{display:flex;align-items:center;gap:7px;font-weight:800;font-size:clamp(12px,1.5vw,17px);
80
+ text-shadow:0 2px 8px rgba(0,20,60,.7)}
81
+ .res .dot{width:15px;height:15px;transform:rotate(45deg);border-radius:3px;
82
+ background:linear-gradient(135deg,var(--gold),#c98a12)}
83
+ .res .r.g .dot{background:linear-gradient(135deg,#57e0ff,#0b6fd0)}
84
+ .res .r.p .dot{background:linear-gradient(135deg,var(--mag),#b0168c)}
85
+ .res .plus{width:20px;height:20px;border:1px solid rgba(255,255,255,.5);border-radius:2px;
86
+ display:grid;place-items:center;font-size:13px;line-height:1;cursor:pointer;background:rgba(255,255,255,.08)}
87
+
88
+ /* ============ PLAYER CARD ============ */
89
+ .pcard{position:absolute;left:14px;top:max(29vh,calc(15vh + 92px));z-index:20;display:flex;align-items:center;gap:10px}
90
+ .pcard .lv{position:relative;width:74px;height:74px;border-radius:50%;
91
+ display:grid;place-items:center;background:radial-gradient(circle at 50% 40%,rgba(10,32,80,.7),rgba(4,12,34,.9));
92
+ border:2px solid rgba(255,255,255,.85);box-shadow:0 0 0 4px rgba(47,168,255,.30),0 6px 20px rgba(0,10,40,.6)}
93
+ .pcard .lv b{font-size:22px;font-weight:900;font-style:italic;line-height:1;letter-spacing:-.04em}
94
+ .pcard .lv s{text-decoration:none;font-size:9px;letter-spacing:.22em;opacity:.8}
95
+ .pcard .lv .rg{position:absolute;inset:-7px;border-radius:50%;border:2px solid rgba(120,215,255,.55);
96
+ border-right-color:transparent;border-bottom-color:transparent}
97
+ .pcard .who b{display:block;font-size:clamp(15px,1.9vw,22px);font-weight:800;letter-spacing:.01em;
98
+ text-shadow:0 2px 10px rgba(0,16,48,.8)}
99
+ .pcard .who s{text-decoration:none;display:block;font-size:.72em;opacity:.62;letter-spacing:.08em;margin-top:2px}
100
+
101
+ /* ============ BIG DISPLAY TYPE ============ */
102
+ .disp{font-weight:900;font-style:italic;letter-spacing:-.045em;text-transform:uppercase;line-height:.92}
103
+ .blue-grad{background:linear-gradient(176deg,#ffffff 0%,#c4ecff 24%,#4fb6ff 58%,#0a63d8 100%);
104
+ -webkit-background-clip:text;background-clip:text;color:transparent;
105
+ filter:drop-shadow(0 3px 0 rgba(4,24,66,.55)) drop-shadow(0 0 16px rgba(70,190,255,.42))}
106
+ .pale-grad{background:linear-gradient(178deg,#ffffff 10%,#d8ecff 50%,#9fc8ef 100%);
107
+ -webkit-background-clip:text;background-clip:text;color:transparent;
108
+ filter:drop-shadow(0 2px 0 rgba(6,30,80,.35))}
109
+ .ghost{color:rgba(255,255,255,.085);font-weight:900;font-style:italic;letter-spacing:-.05em;text-transform:uppercase}
110
+
111
+ .tag{display:inline-block;background:rgba(3,8,22,.82);color:#eaf6ff;font-style:normal;font-weight:600;
112
+ font-size:clamp(9px,1.16vw,13px);letter-spacing:.02em;padding:.24em .68em;border-radius:2px;
113
+ box-shadow:2px 2px 0 rgba(0,10,34,.5)}
114
+ .tag.cy{background:rgba(10,70,140,.9);color:var(--cyan)}
115
+ .tag.rd{background:rgba(150,12,32,.92);color:#fff}
116
+ .tag.gl{background:rgba(150,112,10,.92);color:#fff8dd}
117
+
118
+ /* ============ SANITY ============ */
119
+ .sanity{position:absolute;left:5%;top:14vh;z-index:20;text-align:left}
120
+ .sanity .num{font-size:clamp(40px,7.8vw,106px);position:relative;display:inline-block}
121
+ .sanity .num:before{content:"┼";position:absolute;left:-.62em;top:50%;transform:translateY(-52%);
122
+ font-size:.30em;color:var(--paper);opacity:.95;font-style:normal}
123
+ .sanity .bar{margin-top:2px;display:flex;align-items:center;gap:8px}
124
+ .sanity .bar .t{background:rgba(2,8,22,.78);padding:.2em .6em;font-size:clamp(9px,1.1vw,13px);letter-spacing:.06em}
125
+ .sanity .bar .t i{font-style:italic;font-weight:800;color:#cfe9ff;opacity:.85}
126
+
127
+ /* ============ PRTS TERMINAL CHROME ============ */
128
+ .mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,"Courier New",monospace;
129
+ font-style:normal;letter-spacing:.08em}
130
+ /* CRT 扫描线 + 游走光带(只盖主界面,压在子视图之下) */
131
+ #app.nocrt .scan,#app.nocrt .scanbar{display:none}
132
+ .scan{position:absolute;inset:0;z-index:29;pointer-events:none;opacity:.5;
133
+ background-image:repeating-linear-gradient(180deg,rgba(206,238,255,.028) 0,rgba(206,238,255,.028) 1px,
134
+ rgba(206,238,255,0) 1px,rgba(206,238,255,0) 3px)}
135
+ .scanbar{position:absolute;left:0;right:0;height:20vh;top:-22vh;z-index:29;pointer-events:none;
136
+ background-image:linear-gradient(180deg,rgba(150,225,255,0),rgba(150,225,255,.05) 42%,
137
+ rgba(214,246,255,.09) 50%,rgba(150,225,255,.05) 58%,rgba(150,225,255,0));
138
+ animation:scanrun 9s linear infinite}
139
+ @keyframes scanrun{0%{top:-22vh}100%{top:104vh}}
140
+
141
+ /* 终端面板 */
142
+ .trm{position:absolute;left:3%;right:3%;top:38.5%;bottom:16.5%;z-index:14}
143
+ .trm .box{position:absolute;inset:0;border:1.5px solid rgba(150,215,255,.42);
144
+ background:linear-gradient(158deg,rgba(9,32,76,.84),rgba(4,14,40,.72) 58%,rgba(6,24,60,.80));
145
+ box-shadow:inset 0 0 46px rgba(40,120,220,.24),0 10px 40px rgba(0,10,40,.45)}
146
+ .trm .box:before{content:"";position:absolute;inset:0;opacity:.28;
147
+ background:repeating-linear-gradient(90deg,rgba(120,200,255,.10) 0 1px,transparent 1px 9px)}
148
+ .trm .br{position:absolute;width:10px;height:10px;border:2.5px solid var(--bz-hi);z-index:4;
149
+ filter:drop-shadow(0 0 6px rgba(90,205,255,.85))}
150
+ .trm .br.tl{left:-2px;top:-2px;border-right:0;border-bottom:0}
151
+ .trm .br.tr{right:-2px;top:-2px;border-left:0;border-bottom:0}
152
+ .trm .br.bl{left:-2px;bottom:-2px;border-right:0;border-top:0}
153
+ .trm .br.br2{right:-2px;bottom:-2px;border-left:0;border-top:0}
154
+ .trm-hd{position:absolute;left:0;right:0;top:0;height:10%;display:flex;align-items:center;gap:.35em;
155
+ padding:0 12px;border-bottom:1.5px solid rgba(150,215,255,.36);
156
+ background:linear-gradient(90deg,rgba(47,168,255,.36),rgba(47,168,255,.08) 56%,transparent)}
157
+ .trm-hd .lg{font-size:clamp(16px,4.4vw,36px);letter-spacing:-.02em;line-height:1}
158
+ .trm-hd .proto{font-size:clamp(8px,1.5vw,12px);color:rgba(200,236,255,.75);align-self:flex-end;
159
+ padding-bottom:.22em}
160
+ .trm-hd .link{margin-left:auto;display:flex;align-items:center;gap:.55em;color:var(--cyan);
161
+ font-size:clamp(7px,1.4vw,11px);white-space:nowrap}
162
+ .trm-hd .link i{width:6px;height:6px;border-radius:50%;background:var(--cyan);
163
+ box-shadow:0 0 9px var(--cyan);animation:blip 1.9s ease-in-out infinite}
164
+ @keyframes blip{0%,100%{opacity:1}50%{opacity:.2}}
165
+ .trm-colh{position:absolute;left:0;right:0;top:10%;height:7%;display:grid;grid-template-columns:44% 1fr;
166
+ align-items:center;padding:0 14px;font-size:clamp(7px,1.35vw,11px);letter-spacing:.2em;
167
+ color:rgba(196,230,255,.5)}
168
+ .trm-ft{position:absolute;left:0;right:0;bottom:0;height:9.5%;display:flex;align-items:center;
169
+ padding:0 14px;border-top:1.5px solid rgba(150,215,255,.36);
170
+ background:linear-gradient(90deg,rgba(47,168,255,.24),transparent 62%);
171
+ font-size:clamp(7px,1.35vw,11px);color:rgba(206,238,255,.72)}
172
+ .trm-ft .hint{margin-left:auto;opacity:.6}
173
+ /* 终端等宽字:把 HUD 的数字与状态标签也统一成终端字体 */
174
+ .hud .clock b,.hud .clock s,.res .r,.pcard .who s,.sanity .bar .t{
175
+ font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,"Courier New",monospace;letter-spacing:.05em}
176
+
177
+ /* ============ MAIN MENU · 终端命令行列表 ============ */
178
+ .menu{position:absolute;left:2.6%;right:2.6%;top:16.6%;bottom:9.4%;z-index:3;
179
+ display:grid;grid-template-rows:repeat(5,1fr)}
180
+ .mrow{display:grid;grid-template-columns:44% 1fr;align-items:center;padding:0 6px;
181
+ border-bottom:1px dashed rgba(140,205,255,.26)}
182
+ .mrow:last-child{border-bottom:0}
183
+ .mi{position:relative;display:flex;align-items:center;gap:.72em;min-width:0;cursor:pointer;
184
+ padding:2px 6px;border-radius:2px}
185
+ .mi .tix{flex:0 0 auto;width:2.5em;font-size:clamp(8px,1.5vw,12px);color:rgba(158,214,255,.6)}
186
+ .mi.on .tix{color:var(--cyan);text-shadow:0 0 9px rgba(110,225,255,.9)}
187
+ .mib{position:relative;display:block;min-width:0}
188
+ .mi .en{display:block;font-size:var(--fs,44px);white-space:nowrap;
189
+ filter:drop-shadow(0 3px 0 rgba(3,20,58,.55)) drop-shadow(0 0 22px rgba(80,195,255,.42))}
190
+ .mi .cn{position:absolute;left:.34em;top:calc(100% + 2px);white-space:nowrap;z-index:2;
191
+ font-size:clamp(8px,1.5vw,12px);letter-spacing:.03em;padding:.2em .58em;border-radius:2px;
192
+ background:transparent;color:rgba(210,236,255,.62);
193
+ transition:color var(--fast),background var(--fast)}
194
+ .mi .dm{position:absolute;left:-.46em;top:50%;width:.5em;height:.5em;background:var(--paper);
195
+ transform:translateY(-50%) rotate(45deg);opacity:0;box-shadow:0 0 10px rgba(200,240,255,.9);z-index:3}
196
+ .mi.on{background:linear-gradient(90deg,rgba(47,168,255,.34),rgba(47,168,255,.10) 62%,transparent);
197
+ box-shadow:inset 3px 0 0 var(--bz-hi)}
198
+ .mi.on .en{filter:drop-shadow(0 0 22px rgba(180,235,255,1)) drop-shadow(0 3px 0 rgba(4,24,66,.6))}
199
+ .mi.on .cn{background:rgba(3,8,22,.82);color:#eaf6ff;box-shadow:2px 2px 0 rgba(0,10,34,.5)}
200
+ .mi.on .cn.rd{background:rgba(150,12,32,.92);color:#fff}
201
+ .mi.on .dm{opacity:1}
202
+ .mi.acc .tix{color:var(--gold)}
203
+ .mi.acc .cn{color:rgba(255,216,130,.8)}
204
+ .mi.acc.on .cn{background:rgba(150,112,10,.92);color:#fff8dd;box-shadow:2px 2px 0 rgba(0,10,34,.5)}
205
+ /* 内嵌页面(账本)容器:去掉内边距,让 iframe 铺满 */
206
+ .view .vbody.embed{padding:0;overflow:hidden}
207
+ .ledframe{display:block;width:100%;height:100%;border:0;background:#04060f}
208
+ .ledfail{position:absolute;inset:0;z-index:6;display:grid;place-content:center;gap:14px;
209
+ text-align:center;padding:24px;background:#071026;color:#eaf6ff}
210
+ .ledfail[hidden]{display:none}
211
+ .ledfail .mono{font-size:12px;letter-spacing:.3em;color:var(--mag)}
212
+ .ledfail p{opacity:.72;font-size:14px;margin:0}
213
+ /* ============ LEDGER VIEW(原生账本,终端皮肤) ============ */
214
+ .vbody input{-webkit-user-select:text;user-select:text}
215
+ .lg-top{margin-bottom:2px}
216
+ .lg-tabs{display:flex;gap:6px;margin-bottom:8px}
217
+ .lg-tab{flex:1;text-align:center;padding:.5em 0;font-weight:800;font-style:italic;font-size:.95em;
218
+ background:rgba(3,10,28,.78);border:1.5px solid rgba(120,200,255,.28);border-radius:3px;cursor:pointer;
219
+ letter-spacing:.06em}
220
+ .lg-tab.on{background:linear-gradient(100deg,#5cc4ff,#0d70dd);color:#02122e;border-color:#bfe6ff;
221
+ box-shadow:3px 3px 0 rgba(2,12,36,.5)}
222
+ .lg-sum{display:flex;gap:6px;flex-wrap:wrap;font-size:.72em;letter-spacing:.04em}
223
+ .lg-sum>span{background:rgba(3,8,22,.8);padding:.26em .6em;border-radius:2px;box-shadow:2px 2px 0 rgba(0,10,34,.45)}
224
+ .lg-sum b{font-weight:800}
225
+ .lg-sum b.o{color:#ff8fa3}
226
+ .lg-sum b.i{color:#7df7a8}
227
+ .lg-panel{background:rgba(4,14,38,.72);border:1.5px solid rgba(120,200,255,.26);border-radius:4px;
228
+ padding:12px 12px 14px;margin-top:10px}
229
+ .lg-lbl{font-size:.66em;letter-spacing:.24em;color:rgba(196,230,255,.6);margin:16px 0 7px;
230
+ font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}
231
+ .lg-panel>.lg-lbl:first-child{margin-top:0}
232
+ .lg-seg{display:flex;gap:8px}
233
+ .lg-seg span{flex:1;text-align:center;padding:.55em 0;font-weight:900;font-style:italic;border-radius:3px;
234
+ background:rgba(3,12,34,.8);border:1.5px solid rgba(120,200,255,.22);cursor:pointer;letter-spacing:.08em}
235
+ .lg-seg span.on.out{background:linear-gradient(100deg,#ff5470,#c00a26);color:#fff;border-color:#ffc2cd}
236
+ .lg-seg span.on.in{background:linear-gradient(100deg,#5ef0a5,#0f9d58);color:#04170c;border-color:#bdf7d6}
237
+ .lg-amt{display:flex;align-items:center;gap:8px;border-bottom:2px solid var(--bz-hi);padding:0 2px 8px}
238
+ .lg-amt span{font-size:1.5em;font-weight:800;color:var(--cyan)}
239
+ .lg-amt input{flex:1;min-width:0;background:transparent;border:0;outline:none;color:#fff;
240
+ font-size:clamp(26px,7.4vw,48px);font-weight:900;font-style:italic;letter-spacing:-.03em;
241
+ font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}
242
+ .lg-amt input::placeholder{color:rgba(160,200,240,.32)}
243
+ .lg-in{width:100%;background:rgba(3,12,34,.8);border:1.5px solid rgba(120,200,255,.3);border-radius:3px;
244
+ color:#eaf6ff;padding:.62em .7em;font-size:.95em;outline:none;font-family:inherit}
245
+ .lg-in:focus{border-color:var(--bz-hi)}
246
+ .lg-cats{display:flex;flex-wrap:wrap;gap:6px}
247
+ .lg-cat{padding:.44em .72em;border-radius:3px;background:rgba(3,12,34,.8);
248
+ border:1.5px solid rgba(120,200,255,.22);font-size:.85em;cursor:pointer;white-space:nowrap}
249
+ .lg-cat.on{background:linear-gradient(100deg,#5cc4ff,#0d70dd);color:#02122e;border-color:#bfe6ff;font-weight:800}
250
+ .lg-go{display:flex;gap:10px;align-items:center;margin-top:18px}
251
+ .lg-go .btn{cursor:pointer;text-decoration:none}
252
+ .lg-month{display:flex;align-items:center;justify-content:space-between;margin-top:12px;
253
+ background:rgba(4,14,38,.8);border:1.5px solid rgba(120,200,255,.26);border-radius:4px;padding:7px 8px}
254
+ .lg-month b{font-size:.95em;letter-spacing:.18em}
255
+ .lg-nav{cursor:pointer;color:var(--cyan);padding:0 .7em;font-size:1.05em}
256
+ .lg-day{display:flex;align-items:center;gap:8px;margin:14px 0 6px;font-size:.8em;
257
+ border-left:3px solid var(--bz-hi);padding-left:8px}
258
+ .lg-day b{font-size:1.05em}
259
+ .lg-day em{margin-left:auto;font-style:normal;opacity:.68;font-size:.92em}
260
+ .lg-item{display:flex;align-items:center;gap:9px;padding:8px 2px;
261
+ border-bottom:1px dashed rgba(140,205,255,.16)}
262
+ .lg-item:last-child{border-bottom:0}
263
+ .lg-ico{width:30px;height:30px;flex:0 0 auto;display:grid;place-items:center;border-radius:3px;
264
+ background:rgba(10,40,96,.9);font-size:15px}
265
+ .lg-mid{flex:1;min-width:0;display:block}
266
+ .lg-mid b{display:block;font-size:.92em}
267
+ .lg-mid s{display:block;text-decoration:none;opacity:.6;font-size:.74em;white-space:nowrap;
268
+ overflow:hidden;text-overflow:ellipsis}
269
+ .lg-amt2{font-weight:900;font-style:italic;font-size:1em;white-space:nowrap}
270
+ .lg-amt2.o{color:#ff8fa3}
271
+ .lg-amt2.i{color:#7df7a8}
272
+ .lg-x{width:24px;height:24px;flex:0 0 auto;display:grid;place-items:center;border-radius:3px;
273
+ background:rgba(3,12,34,.8);border:1px solid rgba(255,120,150,.35);color:#ff9db0;cursor:pointer}
274
+ .lg-big{display:flex;align-items:baseline;gap:10px}
275
+ .lg-big s{text-decoration:none;font-size:.8em;opacity:.7}
276
+ .lg-big b{font-size:clamp(28px,7.6vw,56px);font-weight:900;font-style:italic;letter-spacing:-.02em}
277
+ .lg-big b.o{color:#ff8fa3}
278
+ .lg-big b.i{color:#7df7a8}
279
+ .lg-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;margin-top:12px}
280
+ .lg-3 div{background:rgba(3,12,34,.7);border-radius:3px;padding:8px 10px}
281
+ .lg-3 s{display:block;text-decoration:none;font-size:.68em;opacity:.62;letter-spacing:.12em}
282
+ .lg-3 b{font-size:1.05em;font-weight:900}
283
+ .lg-3 b.o{color:#ff8fa3}
284
+ .lg-3 b.i{color:#7df7a8}
285
+ .lg-crow{display:flex;align-items:center;gap:8px;margin:8px 0;font-size:.82em}
286
+ .lg-crow-n{width:5.4em;flex:0 0 auto;white-space:nowrap}
287
+ .lg-bar{flex:1;height:7px;background:rgba(3,12,34,.8);border-radius:2px;overflow:hidden}
288
+ .lg-bar i{display:block;height:100%;background:linear-gradient(90deg,#66d4ff,#1478e2);
289
+ box-shadow:0 0 8px rgba(90,200,255,.6)}
290
+ .lg-empty{opacity:.6;font-size:.85em;padding:6px 0}
291
+ .lg-foot{margin-top:14px;font-size:.66em;opacity:.55;letter-spacing:.08em}
292
+
293
+ .tp{font-size:clamp(9px,1.7vw,13px);color:var(--cyan);display:flex;align-items:center;gap:.4em;opacity:.9}
294
+ .tp .cur{color:var(--cyan);animation:blink 1.05s steps(1) infinite}
295
+ @keyframes blink{0%,49%{opacity:1}50%,100%{opacity:0}}
296
+
297
+ /* ============ CORNER WIDGETS ============ */
298
+ .sticker{position:absolute;z-index:21;border-radius:3px;overflow:hidden;cursor:pointer;
299
+ box-shadow:0 8px 26px rgba(0,20,60,.55);border:1.5px solid rgba(255,255,255,.5)}
300
+ .sticker b{position:absolute;left:0;right:0;bottom:0;display:block;padding:3px 7px;font-size:.72em;
301
+ font-weight:700;letter-spacing:.03em;background:linear-gradient(90deg,rgba(3,10,28,.92),rgba(3,10,28,.55));
302
+ white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
303
+ .sticker:active{transform:scale(.96);filter:brightness(1.18)}
304
+ .bnews{position:absolute;left:14px;bottom:14px;z-index:21;width:min(54vw,308px)}
305
+ .bnews .hd{display:inline-block;background:linear-gradient(90deg,#ff1f36,#c1001c);color:#fff;
306
+ font-weight:800;font-size:.72em;letter-spacing:.1em;padding:.22em .5em;transform:skewX(-10deg)}
307
+ .bnews .bx{margin-top:5px;background:linear-gradient(105deg,rgba(8,26,64,.94),rgba(10,44,104,.86));
308
+ border-left:3px solid var(--bz);padding:8px 10px;display:flex;gap:10px;align-items:center;
309
+ clip-path:polygon(0 0,100% 0,calc(100% - 14px) 100%,0 100%)}
310
+ .bnews .bx .p{margin-left:auto;font-weight:900;font-style:italic;color:var(--gold);font-size:1.5em}
311
+ .bnews .bx .p s{text-decoration:none;font-size:.5em;opacity:.8;margin-left:1px}
312
+ .corner-ics{position:absolute;right:14px;bottom:14px;z-index:21;display:flex;flex-direction:column;gap:8px}
313
+ .corner-ics .ci{width:42px;height:42px;display:grid;place-items:center;font-size:19px;border-radius:4px;
314
+ background:linear-gradient(160deg,rgba(10,44,104,.9),rgba(6,20,50,.92));border:1.5px solid rgba(160,220,255,.55);
315
+ cursor:pointer;box-shadow:0 6px 18px rgba(0,14,44,.5)}
316
+ .corner-ics .ci:active{background:var(--bz-mid)}
317
+
318
+ /* ============ VIEW SHELL ============ */
319
+ .view{position:absolute;inset:0;z-index:40;display:none;flex-direction:column;overflow:hidden;
320
+ background:linear-gradient(165deg,#4ab6ff 0%,#1478e2 40%,#083ea0 100%)}
321
+ .view.on{display:flex}
322
+ .view .split{position:absolute;inset:0;pointer-events:none}
323
+ .view .split .w{position:absolute;inset:0;background:
324
+ linear-gradient(170deg,#ffffff 0%,#eef6ff 60%,#dbe9fb 100%);
325
+ clip-path:polygon(0 0,58% 0,40% 100%,0 100%)}
326
+ .view .split .dots{position:absolute;inset:0;opacity:.5;
327
+ background:radial-gradient(circle,rgba(10,70,150,.30) 1.4px,transparent 1.5px);background-size:8px 8px;
328
+ -webkit-mask-image:linear-gradient(90deg,#000,transparent 46%);mask-image:linear-gradient(90deg,#000,transparent 46%)}
329
+ .view .split .edge{position:absolute;top:-10%;bottom:-10%;left:0;width:60%;
330
+ background:linear-gradient(90deg,transparent,rgba(255,255,255,.28) 62%,transparent 72%);
331
+ clip-path:polygon(0 0,58% 0,40% 100%,0 100%)}
332
+ .view .vbody{position:relative;z-index:3;flex:1;min-height:0;overflow:auto;-webkit-overflow-scrolling:touch;
333
+ padding:0 16px 18px}
334
+ .view.dark{background:linear-gradient(165deg,#0a3f8f,#061c52 60%,#040f30)}
335
+
336
+ .vhead{position:relative;z-index:4;display:flex;align-items:flex-start;gap:12px;
337
+ padding:max(10px,env(safe-area-inset-top)) 16px 8px}
338
+ .vhead .back{width:40px;height:40px;flex:0 0 auto;display:grid;place-items:center;font-size:19px;
339
+ border-radius:4px;background:rgba(4,12,32,.86);color:#fff;cursor:pointer;border:none;
340
+ box-shadow:0 4px 14px rgba(0,10,40,.4)}
341
+ .vhead .back:active{background:var(--mag)}
342
+ .vhead .ttl{line-height:1}
343
+ .vhead .ttl .en{display:block;font-size:clamp(28px,4.6vw,58px)}
344
+ .vhead .ttl .cn{margin-top:4px}
345
+ .vhead .spacer{flex:1}
346
+
347
+ /* ============ GENERIC PARTS ============ */
348
+ .box{background:rgba(4,14,38,.82);border:1.5px solid rgba(120,200,255,.32);border-radius:4px;
349
+ padding:10px 12px;backdrop-filter:blur(8px)}
350
+ .box.lt{background:rgba(255,255,255,.9);border-color:rgba(10,70,150,.22);color:var(--ink)}
351
+ .chip{display:inline-flex;align-items:center;gap:5px;background:rgba(2,8,22,.78);color:#eaf6ff;
352
+ padding:.26em .62em;border-radius:2px;font-size:.78em;font-weight:600;cursor:pointer;
353
+ border:1px solid transparent;white-space:nowrap}
354
+ .chip.on{background:var(--mag);border-color:#fff}
355
+ .chip:active{background:var(--bz-mid)}
356
+ .btn{display:inline-flex;align-items:center;gap:7px;padding:.55em 1.15em;font-weight:900;font-style:italic;
357
+ letter-spacing:.3px;text-transform:uppercase;border:none;border-radius:3px;cursor:pointer;
358
+ background:linear-gradient(100deg,#5cc4ff,#0d70dd);color:#02122e;
359
+ box-shadow:3px 3px 0 rgba(2,12,36,.55)}
360
+ .btn:active{transform:translate(2px,2px);box-shadow:1px 1px 0 rgba(2,12,36,.55)}
361
+ .btn.gh{background:rgba(3,10,28,.8);color:#dff0ff;box-shadow:3px 3px 0 rgba(120,200,255,.25)}
362
+ .btn.rd{background:linear-gradient(100deg,#ff5470,#c00a26);color:#fff}
363
+ .btn.sm{padding:.36em .8em;font-size:.8em}
364
+ .gauge{height:9px;background:rgba(3,12,34,.7);border-radius:2px;overflow:hidden;position:relative}
365
+ .gauge i{display:block;height:100%;background:linear-gradient(90deg,#66d4ff,#1478e2);
366
+ box-shadow:0 0 10px rgba(90,200,255,.7)}
367
+ .gauge i.hp{background:linear-gradient(90deg,#7df7a8,#12b45c)}
368
+ .gauge i.mg{background:linear-gradient(90deg,#ffb0d8,#d0217d)}
369
+ .bar2{height:6px;background:rgba(3,12,34,.72);border-radius:2px;overflow:hidden}
370
+ .bar2 i{display:block;height:100%;background:linear-gradient(90deg,#a6e9ff,#2f9dff)}
371
+ .grid{display:grid;gap:10px}
372
+
373
+ /* operator slot / card */
374
+ .slot{position:relative;border-radius:4px;overflow:hidden;cursor:pointer;
375
+ background:linear-gradient(160deg,rgba(10,40,96,.92),rgba(4,14,40,.95));
376
+ border:1.5px solid rgba(120,200,255,.4)}
377
+ .slot.on{border-color:#fff;box-shadow:0 0 0 2px var(--mag),0 0 22px rgba(255,46,110,.6)}
378
+ .slot .pic{width:100%;height:100%;object-fit:cover;object-position:50% 12%}
379
+ .slot .ov{position:absolute;left:0;right:0;bottom:0;padding:4px 6px 5px;
380
+ background:linear-gradient(180deg,transparent,rgba(2,8,24,.94) 55%)}
381
+ .slot .nm{font-size:.82em;font-weight:800;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
382
+ .slot .cnr{position:absolute;right:4px;top:4px;display:flex;gap:2px}
383
+ .star{color:var(--gold);font-size:.72em;letter-spacing:-1px;text-shadow:0 0 6px rgba(255,200,80,.7)}
384
+ .slot .emp{position:absolute;inset:0;display:grid;place-items:center;font-size:2em;font-weight:900;
385
+ font-style:italic;color:rgba(160,215,255,.3)}
386
+
387
+ /* rows */
388
+ .row{display:flex;align-items:center;gap:10px;padding:9px 11px;border-radius:4px;
389
+ background:rgba(4,14,38,.78);border-left:3px solid var(--bz)}
390
+ .row+.row{margin-top:7px}
391
+ .row .nm{font-weight:700}
392
+ .row .sub{font-size:.76em;opacity:.66}
393
+ .row .rt{margin-left:auto;text-align:right;font-size:.8em}
394
+
395
+ /* ============ CINEMATIC ============ */
396
+ .cine{position:absolute;inset:0;z-index:90;display:none;overflow:hidden;pointer-events:none}
397
+ .cine.on{display:block}
398
+ .cine .flash{position:absolute;inset:0;background:#fff;opacity:0}
399
+ .cine .band{position:absolute;left:-30%;right:-30%;height:26vh;transform:skewY(-7deg)}
400
+ .cine .w1{position:absolute;inset:0;display:none;place-items:center;text-align:center}
401
+ .cine .w1.on{display:grid}
402
+ .cine .w1>div{transform:translateY(-12vh)} /* 让大字落在中间那条色带上 */
403
+ .cine .w1 .en{font-size:clamp(44px,9vw,126px);white-space:nowrap}
404
+ .cine .w1 .sub{margin-top:10px;display:flex;gap:8px;justify-content:center;align-items:center}
405
+ .cine .glyph{position:absolute;font-size:200px;opacity:.16;left:-20px;top:50%;transform:translateY(-50%)}
406
+ .cine .rays{position:absolute;inset:-25%;opacity:0}
407
+ .cine .data{position:absolute;inset:0;opacity:0}
408
+ .cine .blinds{position:absolute;inset:0;overflow:hidden;opacity:0}
409
+ .cine .slice{position:absolute;left:-10%;right:-10%;height:16px;top:40%;opacity:0;
410
+ background-image:linear-gradient(90deg,rgba(255,255,255,0),rgba(255,255,255,.85),rgba(255,255,255,0))}
411
+ .cine .w1 .en.glitch{filter:drop-shadow(3px 0 rgba(255,46,110,.9)) drop-shadow(-3px 0 rgba(90,230,255,.9))}
412
+ .cine .prog{margin:16px auto 0;width:min(46vw,240px);height:3px;background:rgba(255,255,255,.24);overflow:hidden}
413
+ .cine .prog i{display:block;height:100%;width:0;background:linear-gradient(90deg,#fff,#7fd0ff)}
414
+ .cine .hex{position:absolute;left:14px;bottom:14px;font-size:11px;letter-spacing:.16em;
415
+ color:rgba(190,235,255,.72)}
416
+
417
+ /* ============ SHEET / TOAST ============ */
418
+ .sheet{position:absolute;inset:0;z-index:95;display:none;align-items:flex-end;
419
+ background:rgba(1,5,16,.62);backdrop-filter:blur(4px)}
420
+ .sheet.on{display:flex}
421
+ .sheet .pane{width:100%;max-height:82%;overflow:auto;border-radius:10px 10px 0 0;
422
+ background:linear-gradient(180deg,rgba(8,26,62,.99),rgba(3,10,30,.99));
423
+ border-top:3px solid var(--bz);padding:14px 16px calc(18px + env(safe-area-inset-bottom));
424
+ box-shadow:0 -14px 40px rgba(0,10,40,.7)}
425
+ .sheet .pane h3{margin:0 0 10px;font-style:italic;text-transform:uppercase;letter-spacing:-.02em;
426
+ font-size:clamp(18px,2.6vw,30px);font-weight:900}
427
+ .toast{position:absolute;left:50%;bottom:16%;transform:translateX(-50%);z-index:99;
428
+ background:rgba(2,8,22,.94);border:1.5px solid var(--bz);color:#eaf6ff;padding:9px 16px;border-radius:4px;
429
+ font-size:.88em;font-weight:600;white-space:nowrap;opacity:0;pointer-events:none;max-width:86vw;overflow:hidden}
430
+ .mask{position:absolute;inset:0;z-index:98;background:rgba(1,5,16,.7);display:none;place-items:center}
431
+ .mask.on{display:grid}
432
+ .mask .mbox{background:linear-gradient(180deg,#0d2450,#040e26);border:2px solid var(--bz);border-radius:8px;
433
+ padding:20px 22px;min-width:min(76vw,340px);text-align:center;box-shadow:0 20px 50px rgba(0,8,30,.8)}
434
+ .mask .mbox h4{margin:0 0 8px;font-size:1.15em;font-weight:800}
435
+ .mask .mbox p{margin:0 0 16px;font-size:.85em;opacity:.78;line-height:1.5}
436
+ .mask .mbox .fb{display:flex;gap:10px;justify-content:center}
437
+ .flashy{color:var(--gold);font-weight:900;font-style:italic}
438
+
439
+ /* tarot 3d card */
440
+ .tcard{position:relative;perspective:820px;aspect-ratio:2/3;cursor:pointer}
441
+ .tfl{position:relative;width:100%;height:100%;transform-style:preserve-3d}
442
+ .tfl>div{position:absolute;inset:0;border-radius:6px;overflow:hidden;display:grid;place-items:center;
443
+ -webkit-backface-visibility:hidden;backface-visibility:hidden;box-shadow:0 6px 20px rgba(0,10,40,.6)}
444
+ .tfb{transform:rotateY(180deg)}
445
+
446
+ /* view head dark scrim so title stays legible over the white wedge */
447
+ .vhead{background:linear-gradient(100deg,rgba(3,10,32,.92) 0%,rgba(3,10,32,.52) 52%,transparent 84%);
448
+ padding-bottom:16px}
449
+ .view.dark .split .w{opacity:.08}
450
+ .hud{flex-wrap:wrap}
451
+
452
+ /* pull result card */
453
+ .getcard{position:relative;border-radius:5px;overflow:hidden;border:2px solid rgba(255,255,255,.7);
454
+ background:linear-gradient(160deg,#fff0b8,#e0972a 55%,#8a4d00);padding:2px}
455
+ .getcard .inn{border-radius:3px;overflow:hidden;background:#04102c}
456
+ .getcard.gold{border-color:#ffe9a8;box-shadow:0 0 20px rgba(255,200,80,.8)}
457
+ .getcard.violet{border-color:#d9bcff;box-shadow:0 0 18px rgba(160,108,255,.7)}
458
+ .getcard.blue{border-color:#a9ddff;box-shadow:0 0 18px rgba(90,190,255,.6)}
459
+
460
+ /* misc */
461
+ img.av{filter:saturate(1.1) contrast(1.05) -webkit-user-drag:none}
462
+ .scrollx{display:flex;gap:9px;overflow-x:auto;padding-bottom:5px;scrollbar-width:none}
463
+ .scrollx::-webkit-scrollbar{display:none}
464
+ .fline{height:2px;background:linear-gradient(90deg,#2fa8ff,rgba(47,168,255,0));
465
+ margin:8px 0 10px;transform:skewX(-20deg)}
466
+ @media (max-width:620px){
467
+ .sanity{right:5vw;top:15vh}
468
+ .sticker{max-width:34vw}
469
+ }
470
+ </style>
471
+ </head>
472
+ <body>
473
+ <div id="app">
474
+ <div class="bg">
475
+ <div class="arch"></div><div class="grid"></div><div class="drape"></div>
476
+ <div class="stage"></div><div class="table"></div><div class="floor"></div><div class="vig"></div>
477
+ </div>
478
+ <div class="deco" id="deco"></div>
479
+
480
+ <!-- ============ HOME ============ -->
481
+ <section class="screen on" id="home">
482
+ <div class="hud">
483
+ <div class="icb" data-ui="settings">⚙</div>
484
+ <div class="icb" data-ui="notice">!</div>
485
+ <div class="icb" data-ui="mail">✉</div>
486
+ <div class="icb" data-ui="cal">▦</div>
487
+ <div class="clock"><b id="clk">--:--</b><s id="clkd">----/--/--</s></div>
488
+ <div class="res">
489
+ <div class="r p"><span class="dot"></span><span id="res-rd">0</span></div>
490
+ <div class="r"><span class="dot"></span><span id="res-gd">0</span></div>
491
+ </div>
492
+ </div>
493
+
494
+ <div class="pcard">
495
+ <div class="lv"><div class="rg"></div><b>86</b><s>LV</s></div>
496
+ <div class="who"><b>yanliang27</b><s>ID: 890805134</s></div>
497
+ </div>
498
+
499
+ <div class="sanity">
500
+ <div class="num disp blue-grad"><span id="san-num">--</span><span style="font-size:.36em;vertical-align:.32em;letter-spacing:.02em">FISH</span></div>
501
+ <div class="bar">
502
+ <span class="t"><i>FISH</i> · 小鱼干</span>
503
+ <span class="t">WHALE · ONLINE</span>
504
+ </div>
505
+ <div class="bal2"><span>余额</span><i id="res-or" title="真实余额 · 按小账本收支更新">¥--</i></div>
506
+ </div>
507
+
508
+ <!-- ===== PRTS 终端面板 ===== -->
509
+ <div class="trm">
510
+ <div class="box"></div>
511
+ <i class="br tl"></i><i class="br tr"></i><i class="br bl"></i><i class="br br2"></i>
512
+ <div class="trm-hd">
513
+ <span class="lg disp blue-grad">PRTS</span><span class="proto mono">://TERMINAL</span>
514
+ <span class="link mono"><i></i>LINK STABLE 99.8%</span>
515
+ </div>
516
+ <div class="trm-colh mono"><span># COMMAND</span><span># COMMAND</span></div>
517
+ <nav class="menu" id="menu">
518
+ <!--NOJS:STATIC-->
519
+ <div class="mrow"><div class="mi on" style="--fs:clamp(19px,5.6vw,50px)"><span class="tix mono">01</span><span class="mib"><span class="dm"></span><span class="en disp blue-grad" style="font-size:clamp(19px,5.6vw,50px)">SQUADS</span><span class="cn">编队</span></span></div><div class="mi" style="--fs:clamp(19px,5.6vw,50px)"><span class="tix mono">02</span><span class="mib"><span class="dm"></span><span class="en disp blue-grad" style="font-size:clamp(19px,5.6vw,50px)">OPERATOR</span><span class="cn">干员</span></span></div></div>
520
+ <div class="mrow"><div class="mi" style="--fs:clamp(16px,4.6vw,44px)"><span class="tix mono">03</span><span class="mib"><span class="dm"></span><span class="en disp blue-grad" style="font-size:clamp(16px,4.6vw,44px)">STORE</span><span class="cn">采购中心</span></span></div><div class="mi" style="--fs:clamp(16px,4.6vw,44px)"><span class="tix mono">04</span><span class="mib"><span class="dm"></span><span class="en disp blue-grad" style="font-size:clamp(16px,4.6vw,44px)">RECRUIT</span><span class="cn">公开招募</span></span></div></div>
521
+ <div class="mrow"><div class="mi" style="--fs:clamp(16px,4.6vw,44px)"><span class="tix mono">05</span><span class="mib"><span class="dm"></span><span class="en disp blue-grad" style="font-size:clamp(16px,4.6vw,44px)">HEADHUNT</span><span class="cn rd">干员寻访</span></span></div><div class="mi" style="--fs:clamp(16px,4.6vw,44px)"><span class="tix mono">06</span><span class="mib"><span class="dm"></span><span class="en disp blue-grad" style="font-size:clamp(16px,4.6vw,44px)">MISSION</span><span class="cn">任务</span></span></div></div>
522
+ <div class="mrow"><div class="mi acc" style="--fs:clamp(15px,4.2vw,40px)"><span class="tix mono">07</span><span class="mib"><span class="dm"></span><span class="en disp blue-grad" style="font-size:clamp(15px,4.2vw,40px)">RECORDS</span><span class="cn">战绩</span></span></div><div class="mi" style="--fs:clamp(15px,4.2vw,40px)"><span class="tix mono">08</span><span class="mib"><span class="dm"></span><span class="en disp blue-grad" style="font-size:clamp(15px,4.2vw,40px)">ARCHIVE</span><span class="cn">档案</span></span></div></div>
523
+ <div class="mrow"><div class="mi acc" style="--fs:clamp(15px,4.2vw,40px)"><span class="tix mono">09</span><span class="mib"><span class="dm"></span><span class="en disp blue-grad" style="font-size:clamp(15px,4.2vw,40px)">LEDGER</span><span class="cn">账本</span></span></div><div class="tp mono">&gt; <span id="trmCmd">SQUADS · 编队</span><b class="cur">█</b></div></div>
524
+ <!--/NOJS-->
525
+ </nav>
526
+ <div class="trm-ft mono">
527
+ <span id="trmStat">[READY] 01 SQUADS</span>
528
+ <span class="hint">▲▼ SELECT · ⏎ EXEC</span>
529
+ </div>
530
+ </div>
531
+ <div class="scan"></div><div class="scanbar"></div>
532
+
533
+ <div class="sticker" id="stk1" data-act="stk1" style="right:18px;top:max(15vh,140px);width:min(27vw,196px);height:10vh">
534
+ <img src="assets/crew.jpg" style="width:100%;height:100%;object-fit:cover;object-position:50% 30%">
535
+ <b>小账本 ↗</b>
536
+ </div>
537
+ <div class="sticker" id="stk2" data-act="stk2" style="right:18px;top:max(26.5vh,calc(10vh + 154px));width:min(25vw,178px);height:10vh">
538
+ <img src="assets/fig.jpg" style="width:100%;height:100%;object-fit:cover;object-position:50% 22%">
539
+ <b>寻访模拟器 ↗</b>
540
+ </div>
541
+
542
+ <div class="bnews">
543
+ <div class="hd">BREAKING NEWS</div>
544
+ <div class="bx">
545
+ <div style="font-size:.78em;line-height:1.35">礼包限时上架<br><span style="opacity:.6;font-size:.86em">PACK / 每日补给</span></div>
546
+ <div class="p">¥68<s>起</s></div>
547
+ </div>
548
+ </div>
549
+
550
+ <div class="corner-ics">
551
+ <div class="ci" data-ui="depot">▤</div>
552
+ <div class="ci" data-ui="taro">✦</div>
553
+ <div class="ci" id="ci-bgm" title="BGM">♪</div>
554
+ </div>
555
+ </section>
556
+
557
+ <!-- ============ SUB VIEW ============ -->
558
+ <section class="view" id="view">
559
+ <div class="split"><div class="w"></div><div class="dots"></div><div class="edge"></div></div>
560
+ <div class="vghost disp" id="v-ghost">SQUADS</div>
561
+ <div class="vhead">
562
+ <button class="back" id="vback">◀</button>
563
+ <div class="ttl">
564
+ <span class="en disp pale-grad" id="v-en">SQUADS</span>
565
+ <span class="cn tag" id="v-cn">编队</span>
566
+ </div>
567
+ <div class="spacer"></div>
568
+ <div class="res" style="margin-left:0">
569
+ <div class="r g"><span class="dot"></span><span class="res-o">0</span></div>
570
+ <div class="r p"><span class="dot"></span><span class="res-r">0</span></div>
571
+ </div>
572
+ </div>
573
+ <div class="vbody" id="vbody"></div>
574
+ </section>
575
+
576
+ <!-- ============ OVERLAYS ============ -->
577
+ <div class="cine" id="cine">
578
+ <div class="flash" id="cine-flash"></div>
579
+ <div class="rays" id="cine-rays"></div>
580
+ <div class="data" id="cine-data"></div>
581
+ <div class="blinds" id="cine-blinds"></div>
582
+ <div class="slice" id="cine-slice"></div>
583
+ <div class="band" id="cine-b0"></div>
584
+ <div class="band" id="cine-b1"></div>
585
+ <div class="band" id="cine-b2"></div>
586
+ <div class="w1" id="cine-w">
587
+ <div>
588
+ <div class="en disp pale-grad" id="cine-en">SQUADS</div>
589
+ <div class="sub"><span class="tag cy" id="cine-cn">编队</span><span class="tag" id="cine-sub">OPERATION</span></div>
590
+ <div class="prog"><i id="cine-prog"></i></div>
591
+ </div>
592
+ </div>
593
+ <div class="hex mono" id="cine-hex"></div>
594
+ </div>
595
+
596
+ <div class="sheet" id="sheet"><div class="pane" id="sheet-pane"></div></div>
597
+ <div class="mask" id="mask"><div class="mbox" id="mbox"></div></div>
598
+ <div class="toast" id="toast"></div>
599
+ <div class="screen" id="boot"></div>
600
+ <audio id="bgm" loop preload="none"></audio>
601
+ <script>
602
+ /* ===== BGM ENGINE v2 · Color Your Night · 跨页续播 ===== */
603
+ (function(){
604
+ var au=document.getElementById('bgm');
605
+ var btn=document.querySelector('#bgmBtn,[data-bgm],#ci-bgm');
606
+ if(!au)return;
607
+ var K='whale.bgm',KP='whale.bgm.pos';
608
+ var want=localStorage.getItem(K)!=='off';
609
+ var pos0=parseFloat(localStorage.getItem(KP)||'0');if(isNaN(pos0)||pos0<0)pos0=0;
610
+ var abuf=null,dbuf=null,bURL='',node=null,ctx=null,gn=null,fbT=0,pend=0,decoding=0,warmOnly=0;
611
+ var elemTried=sessionStorage.getItem('whale.bgm.ef')==='1'?1:0;
612
+ var waT0=0,waOff=0;
613
+ function lit(s){if(btn)btn.classList.toggle('on',!!s)}
614
+ function playing(){return !!node||(!au.paused&&au.readyState>0)}
615
+ function curPos(){
616
+ if(node&&ctx&&dbuf)return (((ctx.currentTime-waT0)+waOff)%dbuf.duration)||0;
617
+ return au.currentTime||0;
618
+ }
619
+ function savePos(){try{localStorage.setItem(KP,curPos().toFixed(2))}catch(e){}}
620
+ window.addEventListener('pagehide',savePos);
621
+ setInterval(function(){if(playing())savePos()},1000);
622
+ if(btn){btn.addEventListener('click',function(e){
623
+ if(e&&e.preventDefault)e.preventDefault();
624
+ if(playing()){want=false;localStorage.setItem(K,'off');stopAll()}
625
+ else{want=true;localStorage.setItem(K,'on');ensure()}
626
+ });}
627
+ function fadeElem(){try{au.volume=0}catch(e){}var v=0,iv=setInterval(function(){v=Math.min(.6,v+.05);try{au.volume=v}catch(e){};if(v>=.6)clearInterval(iv)},70)}
628
+ function startElem(){
629
+ au.src=bURL;au.load();
630
+ var ap=function(){try{au.currentTime=pos0}catch(e){pos0=0}};
631
+ if(au.readyState>=1)ap();else au.addEventListener('loadedmetadata',ap,{once:true});
632
+ var p=au.play();if(p&&p.catch)p.catch(function(){});
633
+ clearTimeout(fbT);
634
+ fbT=setTimeout(function(){
635
+ if(au.readyState<3||au.paused){try{au.pause()}catch(e){};elemTried=1;try{sessionStorage.setItem('whale.bgm.ef','1')}catch(e){};toWA()}
636
+ },3200);
637
+ }
638
+ function toWA(){
639
+ if(!dbuf){
640
+ if(!abuf||decoding){pend=1;return}
641
+ try{
642
+ var AC=window.AudioContext||window.webkitAudioContext;if(!AC)return;
643
+ ctx=ctx||new AC();if(ctx.resume)ctx.resume();
644
+ decoding=1;
645
+ ctx.decodeAudioData(abuf.slice(0),function(b){decoding=0;dbuf=b;if(warmOnly){warmOnly=0;if(pend&&want){pend=0;ensure()}}else{startNode()}},function(){decoding=0});
646
+ }catch(e){decoding=0}
647
+ return;
648
+ }
649
+ startNode();
650
+ }
651
+ function startNode(){
652
+ try{
653
+ if(!gn){gn=ctx.createGain();gn.connect(ctx.destination)}
654
+ if(ctx.state!=='running'&&ctx.resume)ctx.resume();
655
+ if(node){try{node.stop()}catch(e){};node=null}
656
+ if(dbuf.duration&&pos0>dbuf.duration-0.6)pos0=0;
657
+ node=ctx.createBufferSource();node.buffer=dbuf;node.loop=true;
658
+ node.connect(gn);gn.gain.value=0;
659
+ waT0=ctx.currentTime;waOff=pos0||0;
660
+ node.start(0,waOff);
661
+ var v=0,iv=setInterval(function(){v=Math.min(.6,v+.05);gn.gain.value=v;if(v>=.6)clearInterval(iv)},70);
662
+ lit(1);try{sessionStorage.setItem('whale.bgm.ef','1')}catch(e){}
663
+ }catch(e){}
664
+ }
665
+ function stopAll(){clearTimeout(fbT);savePos();
666
+ try{au.pause()}catch(e){}
667
+ try{if(node){node.stop();node=null}}catch(e){}
668
+ lit(0);
669
+ }
670
+ function ensure(){
671
+ if(playing())return;
672
+ if(abuf&&elemTried){toWA();return}
673
+ if(bURL){startElem();return}
674
+ pend=1;
675
+ }
676
+ au.addEventListener('playing',function(){lit(1);clearTimeout(fbT);fadeElem()});
677
+ au.addEventListener('pause',function(){if(!node)lit(0)});
678
+ document.addEventListener('visibilitychange',function(){if(!document.hidden){if(ctx&&ctx.state!=='running'&&ctx.resume){try{ctx.resume()}catch(e){}}if(want&&!playing())ensure()}});
679
+ function kick(){if(ctx&&ctx.state!=='running'&&ctx.resume){try{ctx.resume()}catch(e){}}if(!want||playing())return;if(bURL)ensure();else pend=1}
680
+ document.addEventListener('pointerdown',kick,true);
681
+ au.addEventListener('playing',function(){document.removeEventListener('pointerdown',kick,true)});
682
+ fetch('bgm.mp3').then(function(r){return r.arrayBuffer()}).then(function(a){
683
+ abuf=a;bURL=URL.createObjectURL(new Blob([a],{type:'audio/mpeg'}));
684
+ if(elemTried&&want){warmOnly=1;toWA()}
685
+ if(want&&!playing()){pend=0;ensure()}
686
+ }).catch(function(){});
687
+ if(want){setTimeout(function(){if(!playing()&&bURL){ensure()}},400)}
688
+ window.__bgmFade=function(){savePos();try{if(node&&gn){var g0=gn.gain.value,t0=Date.now();var iv=setInterval(function(){var k=Math.max(0,1-(Date.now()-t0)/500);gn.gain.value=g0*k;if(k<=0)clearInterval(iv)},60)}}catch(e){}};
689
+ })();
690
+ </script>
691
+
692
+ <!-- ===== WHALE PET ===== -->
693
+ <div id="pet">
694
+ <div id="petBub"><span id="petTxt">哦鲸鲸…</span></div>
695
+ <div id="petB"><img id="petImg" alt="" src="data:image/webp;base64,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"></div>
696
+ </div>
697
+
698
+ </div>
699
+ <style>
700
+ .screen{position:absolute;inset:0}
701
+ .screen#home{display:none}.screen#home.on{display:block}
702
+ #boot{position:absolute;inset:0;z-index:130;background:#f7fbff;display:none;place-items:center}
703
+ #boot.on{display:grid}
704
+ #boot .bi{text-align:center;color:#0a2a5e}
705
+ #boot .bi .e{font-size:clamp(30px,6vw,72px);font-weight:900;font-style:italic;
706
+ letter-spacing:-.04em;text-transform:uppercase;color:#0d63c8}
707
+ #boot .bi .s{margin-top:6px;font-size:.82em;letter-spacing:.34em;opacity:.6}
708
+ #boot .bi .ln{height:3px;background:#0d63c8;margin-top:14px;transform-origin:left;width:220px}
709
+ /* ==================================================================
710
+ FLAT / GEOMETRIC SKIN (v10)
711
+ 参考:明日方舟主界面(扁平青蓝 + 黄色数字徽章 + 斜切标签)
712
+ P3R 菜单(纯色块面 + 斜平行四边形 + 硬阴影 + 红黑强调)
713
+ 原则:不用渐变、不用发光、不用毛玻璃、不用扫描线;只用纯色块 + 斜切 + 硬偏移阴影。
714
+ ================================================================== */
715
+ :root{
716
+ --fi:#070b16; /* 墨黑(块面底) */
717
+ --fi2:#0d1526; /* 深蓝黑(面板底) */
718
+ --fc:#4cc9ff; /* 主青 */
719
+ --fcd:#1273c8; /* 深青 */
720
+ --fr:#ff2f52; /* 强调红 */
721
+ --fy:#ffd23f; /* 徽章黄 */
722
+ --fw:#eef7ff; /* 白 */
723
+ --sk:-14deg; /* 统一斜切角 */
724
+ }
725
+ /* ---------- 1. 清掉复古层 ---------- */
726
+ .scan,.scanbar{display:none!important}
727
+ .cine .rays,.cine .data,.cine .hex{display:none!important}
728
+ .cine .slice{display:block!important;height:7px;background:#ff2f52;background-image:none;opacity:0}
729
+ .trm .box:before{display:none!important}
730
+ .bg .drape{display:none}
731
+ .bg .grid{opacity:.5}
732
+ /* ---------- 2. 顶栏 / 资源 / 玩家卡 ---------- */
733
+ .hud .icb{background:var(--fi);border:1.5px solid rgba(76,201,255,.5);border-radius:0;
734
+ backdrop-filter:none;-webkit-backdrop-filter:none;box-shadow:3px 3px 0 rgba(0,0,0,.5)}
735
+ .hud .icb:active{background:var(--fc);color:var(--fi)}
736
+ .hud .clock b{color:var(--fw);font-weight:900;font-size:clamp(30px,8.8vw,42px);letter-spacing:.04em;
737
+ text-shadow:0 0 20px rgba(76,201,255,.5),0 0 48px rgba(76,201,255,.2)}
738
+ .hud .clock s{opacity:.95;color:var(--fc);font-size:clamp(11px,3.2vw,14px);letter-spacing:.18em}
739
+ .sanity .bal2{display:inline-flex;align-items:baseline;gap:6px;margin-top:4px;padding-top:3px;border-top:1px solid rgba(76,201,255,.45)}
740
+ .sanity .bal2 span{font-size:10px;letter-spacing:.26em;color:var(--fc);opacity:.95;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}
741
+ .sanity .bal2 i{font-style:normal;font-weight:900;color:var(--fw);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
742
+ font-size:clamp(16px,4.4vw,20px);text-shadow:0 0 14px rgba(76,201,255,.4);letter-spacing:.04em}
743
+ .res .dot{width:13px;height:13px;border-radius:0;transform:skewX(var(--sk));box-shadow:none}
744
+ .res .r.g .dot{background:var(--fc)}
745
+ .res .r.p .dot{background:var(--fr)}
746
+ .res .r .dot{background:var(--fy)}
747
+ .res .r{font-weight:900;text-shadow:2px 2px 0 rgba(0,0,0,.55)}
748
+ .pcard .lv{background:var(--fi);border:2.5px solid var(--fc);border-radius:50%;box-shadow:none}
749
+ .pcard .lv .rg{border-color:var(--fy);border-radius:50%}
750
+ .pcard .who b{text-shadow:2.5px 2.5px 0 rgba(0,0,0,.6)}
751
+ .pcard .who s{opacity:.8}
752
+ .sanity .num{background-image:none!important;-webkit-background-clip:border-box!important;background-clip:border-box!important;
753
+ color:var(--fw);filter:none!important;text-shadow:4px 4px 0 var(--fcd)}
754
+ .sanity .num:before{color:var(--fc);opacity:1}
755
+ .sanity .bar .t{background:var(--fi);border-radius:0;box-shadow:none;font-weight:700}
756
+ .sanity .bar .t i{color:var(--fc);font-style:normal;font-weight:900}
757
+ /* 贴纸 / 新闻 / 角标:直角 + 硬阴影 */
758
+ .sticker{border-radius:0;border:2px solid var(--fi);box-shadow:4px 4px 0 rgba(0,0,0,.5)}
759
+ .sticker b{background:var(--fi);font-weight:700}
760
+ .bnews .hd{background:var(--fr);transform:skewX(var(--sk));font-weight:900;border-radius:0}
761
+ .bnews .bx{background:var(--fi);border-left:0;border-top:2px solid var(--fc);clip-path:none;
762
+ box-shadow:4px 4px 0 rgba(0,0,0,.5)}
763
+ .bnews .bx .p{color:var(--fy)}
764
+ .corner-ics .ci{background:var(--fi);border:2px solid var(--fc);border-radius:0;box-shadow:3px 3px 0 rgba(0,0,0,.5)}
765
+ .corner-ics .ci:active{background:var(--fc);color:var(--fi)}
766
+ /* ---------- 3. PRTS 面板:纯色块面 ---------- */
767
+ .trm .box{background:rgba(7,12,24,.82);border:1.5px solid rgba(76,201,255,.55);border-radius:0;
768
+ box-shadow:6px 6px 0 rgba(0,0,0,.45);backdrop-filter:none;-webkit-backdrop-filter:none}
769
+ .trm .br{width:13px;height:13px;border-width:3px;border-color:var(--fc);filter:none}
770
+ .trm-hd{background:var(--fi2);background-image:none;border-bottom:3px solid var(--fc);padding:0 10px}
771
+ .trm-hd .lg{background-color:var(--fc)!important;background-image:none!important;-webkit-background-clip:border-box!important;background-clip:border-box!important;
772
+ color:var(--fi);filter:none!important;padding:0 .18em;transform:skewX(var(--sk));
773
+ font-size:clamp(15px,3.9vw,32px)}
774
+ .trm-hd .proto{color:var(--fy);font-weight:700;align-self:center;padding-bottom:0}
775
+ .trm-hd .link{color:var(--fc)}
776
+ .trm-hd .link i{border-radius:0;box-shadow:none;background:var(--fc);width:7px;height:7px}
777
+ .trm-colh{color:rgba(120,190,240,.7);font-weight:700}
778
+ .trm-ft{background:var(--fi2);background-image:none;border-top:3px solid var(--fc)}
779
+ /* ---------- 4. 命令行:扁平青字 + 黄徽章 + 斜标签 ---------- */
780
+ .menu{left:2.4%;right:2.4%}
781
+ .mrow{border-bottom:0;padding:0 2px}
782
+ .mrow:after{content:"";position:absolute;left:0;right:0;bottom:0;height:1.5px;
783
+ background:rgba(76,201,255,.25);transform:skewX(var(--sk))}
784
+ .mi{padding:2px 4px}
785
+ .mi .tix{flex:0 0 auto;width:auto;background:var(--fy);color:var(--fi);font-weight:900;
786
+ padding:.08em .46em;border-radius:0;transform:skewX(var(--sk));letter-spacing:.06em}
787
+ .mi .en{position:relative;background-image:none!important;-webkit-background-clip:border-box!important;
788
+ background-clip:border-box!important;color:var(--fc);filter:none!important;
789
+ text-shadow:3px 3px 0 rgba(4,9,20,.95);letter-spacing:-.035em}
790
+ .mi .cn{background:var(--fi);color:var(--fw);border-radius:0;box-shadow:none;font-weight:700;
791
+ transform:skewX(var(--sk));letter-spacing:.05em}
792
+ .mi .dm{display:none}
793
+ .mib:before{content:"";position:absolute;left:-.3em;right:-.3em;top:0;bottom:0;
794
+ background:var(--fi);transform:skewX(var(--sk));opacity:0}
795
+ .mib:after{content:"";position:absolute;left:0;bottom:-.3em;width:56%;height:3px;
796
+ background:var(--fc);opacity:.6;transform:skewX(var(--sk))}
797
+ .mi.on{background:none;box-shadow:none}
798
+ .mi.on .mib:before{opacity:1}
799
+ .mi.on .mib:after{width:100%;background:var(--fy);opacity:1;height:4px}
800
+ .mi.on .en{color:var(--fw);text-shadow:3.5px 3.5px 0 var(--fr)}
801
+ .mi.on .cn{background:var(--fr);color:#fff}
802
+ .mi.on .tix{background:var(--fr);color:#fff}
803
+ .mi.acc .tix{background:var(--fy);color:var(--fi)}
804
+ .mi.acc .cn{background:var(--fi);color:var(--fy)}
805
+ .mi.acc.on .cn{background:var(--fy);color:var(--fi)}
806
+ .tp{color:var(--fc);font-weight:700}
807
+ .tp .cur{color:var(--fy)}
808
+ /* ---------- 5. 过场:扁平块面 ---------- */
809
+ .cine .band{border-radius:0;box-shadow:none;height:44vh} /* v17:三条带搭接铺满,无透缝 */
810
+ .cine .w1 .en{background-image:none!important;-webkit-background-clip:border-box!important;
811
+ background-clip:border-box!important;color:var(--fw);filter:none!important;
812
+ text-shadow:5px 5px 0 var(--fi);letter-spacing:-.04em}
813
+ .cine .w1 .sub .tag{border-radius:0;box-shadow:none;background:var(--fi);font-weight:700;
814
+ transform:skewX(var(--sk))}
815
+ .cine .w1 .sub .tag.cy{background:var(--fc);color:var(--fi)}
816
+ .cine .prog{height:4px;background:rgba(255,255,255,.22);margin-top:18px}
817
+ .cine .prog i{background:var(--fr)}
818
+ /* ---------- 6. 子视图 / 通用件:去渐变去圆角 ---------- */
819
+ .btn{border-radius:0;background:var(--fc);color:var(--fi);box-shadow:3px 3px 0 rgba(0,0,0,.55);font-style:italic}
820
+ .btn.gh{background:var(--fi);color:var(--fw);box-shadow:3px 3px 0 rgba(76,201,255,.35)}
821
+ .btn.rd{background:var(--fr);color:#fff}
822
+ .btn.mag{background:var(--fr);color:#fff}
823
+ .btn.gold{background:var(--fy);color:var(--fi)}
824
+ .btn.violet{background:#8b6cff;color:#fff}
825
+ .chip{border-radius:0}
826
+ .chip.on{background:var(--fr);border-color:var(--fr)}
827
+ .box{border-radius:0;background:var(--fi2);border:1.5px solid rgba(76,201,255,.3);
828
+ backdrop-filter:none;-webkit-backdrop-filter:none;box-shadow:3px 3px 0 rgba(0,0,0,.35)}
829
+ .gauge,.bar2{border-radius:0;background:rgba(4,9,20,.85)}
830
+ .gauge i,.bar2 i{background:var(--fc);box-shadow:none}
831
+ .gauge i.hp{background:#4bd07a}
832
+ .gauge i.mg{background:var(--fr)}
833
+ .slot{border-radius:0}
834
+ .view{background:var(--fi2)}
835
+ .view .split .w{background:var(--fw);clip-path:polygon(0 0,56% 0,38% 100%,0 100%)}
836
+ .view .split .edge{display:none}
837
+ .view.dark{background:#060c1a}
838
+ .view .split .dots{opacity:.35;background-image:radial-gradient(circle,rgba(76,201,255,.5) 1.4px,rgba(0,0,0,0) 1.5px)}
839
+ .vhead .back{border-radius:0;background:var(--fi);box-shadow:3px 3px 0 rgba(0,0,0,.5);border:1.5px solid var(--fc)}
840
+ .vhead .back:active{background:var(--fr)}
841
+ .vhead .ttl .en{background-image:none!important;-webkit-background-clip:border-box!important;
842
+ background-clip:border-box!important;color:var(--fw);filter:none!important;
843
+ text-shadow:4px 4px 0 var(--fcd);font-style:italic}
844
+ .vhead .ttl .cn{border-radius:0;background:var(--fc);color:var(--fi);transform:skewX(var(--sk));font-weight:800}
845
+ .tag{border-radius:0;font-weight:700;transform:skewX(var(--sk))}
846
+ .tag.cy{background:var(--fc);color:var(--fi)}
847
+ .tag.rd{background:var(--fr);color:#fff}
848
+ .tag.gl{background:var(--fy);color:var(--fi)}
849
+ .sheet{border-radius:0}
850
+ .sheet .pane{border-radius:0;background:var(--fi2);border-top:3px solid var(--fc)}
851
+ .toast{border-radius:0;background:var(--fi);border:1.5px solid var(--fc);font-weight:700}
852
+ .mask{border-radius:0}
853
+ .mask .mbox{border-radius:0;background:var(--fi2);border:2px solid var(--fc);box-shadow:6px 6px 0 rgba(0,0,0,.5)}
854
+ .lg-tab,.lg-panel,.lg-month,.lg-seg span,.lg-cat,.lg-in,.lg-ico,.lg-x,.lg-3 div,.lg-sum>span{border-radius:0!important}
855
+ .lg-tab.on,.lg-cat.on{background:var(--fc);color:var(--fi);border-color:var(--fc)}
856
+ .lg-panel{background:var(--fi2);border-color:rgba(76,201,255,.3)}
857
+ .lg-bar,.lg-bar i{border-radius:0}
858
+ .lg-bar i{background:var(--fc);box-shadow:none}
859
+ .lg-amt{border-bottom:3px solid var(--fc)}
860
+ .lg-amt span{color:var(--fc)}
861
+ .lg-tab{transform:skewX(var(--sk));background:rgba(7,12,24,.85)}
862
+ .lg-day{border-left:4px solid var(--fc)}
863
+
864
+ /* ---------- 7. 子视图:纯色底 + 斜切青线 + 巨型幽灵字 ---------- */
865
+ .view{background:#0b1220}
866
+ .view.dark{background:#070d18}
867
+ .view .split .w{background:rgba(76,201,255,.07);clip-path:polygon(0 0,58% 0,40% 100%,0 100%)}
868
+ .view .split .dots{opacity:.55;-webkit-mask-image:linear-gradient(90deg,#000,transparent 52%);
869
+ mask-image:linear-gradient(90deg,#000,transparent 52%);
870
+ background-image:radial-gradient(circle,rgba(76,201,255,.35) 1.3px,rgba(0,0,0,0) 1.4px)}
871
+ .view .split .edge{left:49%;right:auto;width:4px;top:-8%;bottom:-8%;background:var(--fc);opacity:.75;
872
+ clip-path:none;transform:skewX(-4.7deg)}
873
+ .vghost{position:absolute;left:-3%;bottom:1%;z-index:1;pointer-events:none;white-space:nowrap;
874
+ font-size:clamp(54px,17vw,190px);line-height:.8;font-weight:900;font-style:italic;
875
+ letter-spacing:-.05em;text-transform:uppercase;color:rgba(76,201,255,.07)}
876
+ .view.dark .vghost{color:rgba(120,190,255,.09)}
877
+
878
+
879
+ /* ---------- 8. 背景:去掉模糊/放射,只留纯色 + 网格 + 气泡 ---------- */
880
+ .bg{background:linear-gradient(180deg,#060d1e 0%,#0a2040 46%,#060d1e 100%)}
881
+ .bg .arch{display:none}
882
+ .bg .stage,.bg .table{display:none}
883
+ .bg .grid{opacity:.6;background-size:4.6vw 4.6vw;
884
+ background-image:repeating-conic-gradient(from 45deg at 50% 50%,rgba(120,190,255,.09) 0 25%,rgba(0,0,0,0) 0 50%)}
885
+ .bg .vig{background:radial-gradient(ellipse 72% 62% at 50% 42%,rgba(0,0,0,0) 42%,rgba(2,7,20,.72) 100%)}
886
+ .bub{background:rgba(76,201,255,.5);box-shadow:none}
887
+ .bub.pet{background:rgba(76,201,255,.34)}
888
+ .bub.pale{background:rgba(180,230,255,.4)}
889
+ .arc{border-color:rgba(76,201,255,.22)}
890
+ .ray{background:linear-gradient(90deg,rgba(0,0,0,0),rgba(120,205,255,.5),rgba(0,0,0,0))}
891
+
892
+ /* ===== 完整寻访模拟器:页内全屏 iframe 覆盖层 ===== */
893
+ .gv{position:fixed;inset:0;z-index:9999;display:none;flex-direction:column;background:#04060f}
894
+ .gv.on{display:flex}
895
+ .gv-top{flex:none;display:flex;align-items:center;gap:8px;
896
+ padding:calc(8px + env(safe-area-inset-top)) 10px 8px;
897
+ background:linear-gradient(90deg,#08234f,#04060f);border-bottom:2px solid #4cc9ff}
898
+ .gv-title{flex:1;min-width:0;font-size:12.5px;font-weight:800;font-style:italic;color:#d9f838;
899
+ white-space:nowrap;overflow:hidden;text-overflow:ellipsis;letter-spacing:.04em}
900
+ .gv-top a,.gv-top button{flex:none;border:2px solid #04060f;background:#f2f7ff;color:#04060f;
901
+ font-size:12px;font-weight:800;font-style:italic;padding:7px 10px;text-decoration:none;
902
+ cursor:pointer;transform:skewX(-8deg);font-family:inherit;line-height:1}
903
+ .gv-top button{background:#d9f838}
904
+ .gv-frame{flex:1;width:100%;border:0;background:#04060f}
905
+
906
+ /* ===== WHALE PET ===== */
907
+ /* ================= WHALE PET · 鲸鲸桌宠 ================= */
908
+ #pet{position:fixed;right:60px;bottom:0;z-index:22;pointer-events:none;display:flex;flex-direction:column;align-items:flex-end;-webkit-user-select:none;user-select:none}
909
+ #petB{pointer-events:auto;cursor:pointer;animation:petbob 3.6s ease-in-out infinite;-webkit-tap-highlight-color:transparent;touch-action:manipulation}
910
+ #petImg{display:block;width:clamp(92px,24vw,128px);height:auto;transform-origin:50% 94%;transition:transform .17s cubic-bezier(.34,1.56,.64,1);filter:drop-shadow(-5px -3px 14px rgba(76,201,255,.16))}
911
+ #petB.sq #petImg{transform:scale(.84,.74);transition:transform .07s ease-out}
912
+ #petB.pop #petImg{animation:petpop .36s cubic-bezier(.34,1.56,.64,1)}
913
+ @keyframes petbob{0%,100%{transform:translateY(0)}50%{transform:translateY(-4px)}}
914
+ @keyframes petpop{0%{transform:scale(.84,.74)}60%{transform:scale(1.05,.97)}100%{transform:scale(1,1)}}
915
+ #petBub{pointer-events:none;position:relative;opacity:0;transform:translateY(7px) skewX(-8deg);transition:opacity .2s,transform .2s;background:rgba(7,12,24,.94);border:1.5px solid #4cc9ff;box-shadow:4px 4px 0 rgba(18,115,200,.5);color:#eef7ff;font-size:11px;line-height:1.3;padding:6px 9px;margin:0 8px 9px 0;max-width:46vw;white-space:nowrap;font-family:ui-monospace,Menlo,monospace;letter-spacing:.03em}
916
+ #petBub.on{opacity:1;transform:translateY(0) skewX(-8deg)}
917
+ #petBub:after{content:'';position:absolute;right:7px;bottom:-6px;width:9px;height:9px;background:rgba(7,12,24,.94);border-right:1.5px solid #4cc9ff;border-bottom:1.5px solid #4cc9ff;transform:rotate(45deg)}
918
+
919
+
920
+ /* ===== BGM ===== */
921
+ #bgm{display:none}
922
+ .corner-ics .ci.on{background:var(--fc);color:var(--fi);animation:bgmp 1.8s ease-in-out infinite}
923
+ @keyframes bgmp{50%{box-shadow:3px 3px 0 rgba(0,0,0,.5),0 0 12px rgba(76,201,255,.4)}}
924
+
925
+ /* ==== tarot v2 ==== */
926
+ .tfin{position:absolute;left:0;top:0;right:0;bottom:0;display:grid;place-items:center}
927
+ .tfin.rev{transform:rotate(180deg)}
928
+ @keyframes tsh{0%{transform:translateY(-14px) rotate(-6deg);opacity:0}55%{transform:translateY(3px) rotate(2deg);opacity:1}100%{transform:none}}
929
+ #tarogrid .tcard{animation:tsh .55s ease both}
930
+ #tarogrid .tcard:nth-child(2){animation-delay:.08s}
931
+ #tarogrid .tcard:nth-child(3){animation-delay:.16s}
932
+
933
+ /* ==== tarot 牌面图 ==== */
934
+ #tarogrid .tcard{aspect-ratio:300/527}
935
+ .timg{position:absolute;left:0;top:0;width:100%;height:100%;object-fit:cover;border-radius:2px;z-index:2}
936
+ .trib{position:absolute;left:0;right:0;bottom:0;background:rgba(4,10,26,.74);color:#dff3ff;font-size:.6em;text-align:center;padding:3px 2px;letter-spacing:.06em;line-height:1.2;z-index:3;border-radius:0 0 2px 2px}
937
+ </style>
938
+ <script>
939
+ (function(){
940
+ 'use strict';
941
+ var $=function(s,r){return (r||document).querySelector(s)};
942
+ var $$=function(s,r){return [].slice.call((r||document).querySelectorAll(s))};
943
+
944
+ /* ================= STATE ================= */
945
+ var S={res:{or:1469700,rd:57715,gd:0},page:'home',sel:0,
946
+ snd:true,fx:true,dark:false,crt:true,
947
+ squads:[['makoto','aigis','mitsuru','akihiko','yukari','fuuka'],
948
+ ['junpei','yukari','makoto','fuuka',null,null],
949
+ ['aigis','akihiko',null,null,null,null],
950
+ ['mitsuru','junpei','fuuka',null,null,null]],
951
+ curSquad:0,
952
+ ops:[], owned:{}, recruit:null};
953
+
954
+ /* ================= AUDIO ================= */
955
+ var AC=null;
956
+ function ac(){try{if(!AC)AC=new (window.AudioContext||window.webkitAudioContext)();}catch(e){return null}
957
+ if(AC&&AC.state==='suspended')AC.resume();return AC}
958
+ function osc(a){if(!S.snd)return;var c=ac();if(!c)return;a=a||{};
959
+ var d=a.dur||.2,t=c.currentTime+(a.delay||0);
960
+ var o=c.createOscillator(),g=c.createGain(),lp=c.createBiquadFilter();
961
+ o.type=a.type||'triangle';
962
+ o.frequency.setValueAtTime(a.f1||440,t);
963
+ if(a.f2)o.frequency.exponentialRampToValueAtTime(Math.max(24,a.f2),t+d);
964
+ lp.type='lowpass';lp.frequency.setValueAtTime(a.lp||3200,t);lp.Q.value=a.q||.8;
965
+ var v=(a.vol==null?.075:a.vol);
966
+ g.gain.setValueAtTime(.0001,t);g.gain.linearRampToValueAtTime(v,t+(a.atk||.012));
967
+ g.gain.exponentialRampToValueAtTime(.0001,t+d);
968
+ o.connect(lp);lp.connect(g);g.connect(c.destination);o.start(t);o.stop(t+d+.04);}
969
+ function nz(a){if(!S.snd)return;var c=ac();if(!c)return;a=a||{};
970
+ var d=a.dur||.2,t=c.currentTime+(a.delay||0);
971
+ var len=Math.max(1,Math.floor(c.sampleRate*d)),buf=c.createBuffer(1,len,c.sampleRate),ch=buf.getChannelData(0);
972
+ for(var i=0;i<len;i++)ch[i]=Math.random()*2-1;
973
+ var s=c.createBufferSource();s.buffer=buf;
974
+ var f=c.createBiquadFilter();f.type=a.type||'bandpass';
975
+ f.frequency.setValueAtTime(a.f1||1400,t);
976
+ if(a.f2)f.frequency.exponentialRampToValueAtTime(a.f2,t+d);
977
+ f.Q.value=a.q||1.1;
978
+ var g=c.createGain();g.gain.setValueAtTime(.0001,t);g.gain.linearRampToValueAtTime(a.vol==null?.1:a.vol,t+.008);
979
+ g.gain.exponentialRampToValueAtTime(.0001,t+d);
980
+ s.connect(f);f.connect(g);g.connect(c.destination);s.start(t);s.stop(t+d+.02);}
981
+ var sfx={
982
+ move:function(){osc({f1:920,f2:1240,dur:.075,vol:.04,lp:2600})},
983
+ ok:function(){osc({f1:620,dur:.11,vol:.07});osc({f1:930,dur:.16,vol:.06,delay:.07})},
984
+ back:function(){osc({f1:520,f2:330,dur:.14,vol:.06})},
985
+ tap:function(){nz({f1:2600,f2:900,dur:.07,vol:.05})},
986
+ stamp:function(){osc({f1:190,f2:70,dur:.22,vol:.13,type:'sine'});nz({f1:900,f2:220,dur:.14,vol:.09,lp:1})},
987
+ chime:function(){[523,659,784].forEach(function(f,i){osc({f1:f,dur:.5,vol:.055,delay:i*.075,lp:4200})})},
988
+ gold:function(){[659,880,1046,1318,1568].forEach(function(f,i){osc({f1:f,dur:.45,vol:.06,delay:i*.055,lp:5200});
989
+ nz({f1:3200,f2:1200,dur:.25,vol:.05,delay:i*.055})})},
990
+ deny:function(){osc({f1:200,f2:130,dur:.18,vol:.09,type:'sawtooth',lp:900})}
991
+ };
992
+ /* ===== WHALE PET SQUEAK ===== */
993
+ function squeak(){if(!S.snd)return;var c=ac();if(!c)return;
994
+ var t0=c.currentTime+.01,b=.96+Math.random()*.09;
995
+ [0,.085].forEach(function(dl,i){
996
+ var d=i?.115:.10,t=t0+dl,
997
+ o=c.createOscillator(),g=c.createGain(),
998
+ v=c.createOscillator(),vg=c.createGain(),
999
+ f=c.createBiquadFilter();
1000
+ o.type='sine';o.frequency.setValueAtTime((i?930:640)*b,t);
1001
+ o.frequency.exponentialRampToValueAtTime((i?1560:1230)*b,t+d*.72);
1002
+ v.type='sine';v.frequency.value=32+i*7;vg.gain.value=36;
1003
+ v.connect(vg);vg.connect(o.frequency);
1004
+ f.type='bandpass';f.frequency.value=1450;f.Q.value=.85;
1005
+ g.gain.setValueAtTime(.0001,t);g.gain.linearRampToValueAtTime(.09,t+.007);
1006
+ g.gain.exponentialRampToValueAtTime(.0001,t+d);
1007
+ o.connect(f);f.connect(g);g.connect(c.destination);
1008
+ o.start(t);o.stop(t+d+.04);v.start(t);v.stop(t+d+.04);
1009
+ });}
1010
+ window.__squeak=squeak;
1011
+
1012
+
1013
+
1014
+ /* ================= DECO PARTICLES ================= */
1015
+ var deco=$('#deco'),parts=[],arcs=[];
1016
+ function mkDeco(){
1017
+ for(var i=0;i<26;i++){
1018
+ var e=document.createElement('div');
1019
+ var kind=i%3;
1020
+ e.className='bub'+(kind===1?' pet':'')+(kind===2?' pale':'');
1021
+ var sz=6+Math.random()*26;
1022
+ e.style.width=sz+'px';e.style.height=sz+'px';
1023
+ e.style.opacity=(.28+Math.random()*.5).toFixed(2);
1024
+ deco.appendChild(e);
1025
+ parts.push({el:e,x:Math.random()*100,y:Math.random()*100,sp:1.1+Math.random()*2.6,
1026
+ ph:Math.random()*6.28,amp:.6+Math.random()*2.2,fr:.25+Math.random()*.6,sc:1});
1027
+ }
1028
+ for(var j=0;j<3;j++){
1029
+ var a=document.createElement('div');a.className='arc';
1030
+ var w=26+j*13;a.style.width=w+'vw';a.style.height=w*1.35+'vw';
1031
+ a.style.left=(6+j*20)+'vw';a.style.top=(28-j*9)+'vh';a.style.opacity=.2;
1032
+ deco.appendChild(a);arcs.push({el:a,ph:j*2.1});
1033
+ }
1034
+ for(var k=0;k<5;k++){
1035
+ var r=document.createElement('div');r.className='ray';
1036
+ r.style.width=(14+Math.random()*22)+'vw';r.style.left=(4+(k*18))+'vw';
1037
+ r.style.top=(12+Math.random()*66)+'vh';r.style.opacity=.14+Math.random()*.2;
1038
+ deco.appendChild(r);
1039
+ }
1040
+ }
1041
+ var last=performance.now(),acc=0;
1042
+ function loop(now){
1043
+ var dt=Math.min(.05,(now-last)/1000);last=now;
1044
+ for(var i=0;i<parts.length;i++){
1045
+ var p=parts[i];
1046
+ p.y-=(p.sp*dt*100)/window.innerHeight*100*0.5+0.22*dt*10;
1047
+ p.ph+=dt*p.fr*2;
1048
+ if(p.y<-6){p.y=106;p.x=Math.random()*100}
1049
+ var wob=Math.sin(p.ph)*p.amp;
1050
+ p.el.style.transform='translate3d('+(p.x*window.innerWidth/100+wob)+'px,'+(p.y*window.innerHeight/100)+'px,0)';
1051
+ }
1052
+ for(var j=0;j<arcs.length;j++){
1053
+ var a=arcs[j],s=1+Math.sin(now/1600+a.ph)*.045;
1054
+ a.el.style.transform='scale('+s.toFixed(4)+') rotate('+(now/9000*(j%2?-1:1)).toFixed(3)+'rad)';
1055
+ }
1056
+ acc+=dt;
1057
+ if(acc>.5){acc=0;pulse();}
1058
+ requestAnimationFrame(loop);
1059
+ }
1060
+ function pulse(){var t=new Date();
1061
+ $('#clk').textContent=('0'+t.getHours()).slice(-2)+':'+('0'+t.getMinutes()).slice(-2);
1062
+ $('#clkd').textContent=t.getFullYear()+'/'+('0'+(t.getMonth()+1)).slice(-2)+'/'+('0'+t.getDate()).slice(-2);}
1063
+
1064
+ /* ================= DATA ================= */
1065
+ var OPS=[
1066
+ {id:'makoto',en:'MAKOTO',cn:'結城 理',cls:'前锋',star:6,img:'hero',pos:'44% 10%',power:986,hp:1820,atk:648,def:412,
1067
+ skill:'大封印 · SEES',desc:'被命运牵引的少年。能召唤复数人格面具,擅长以速度压制敌阵。'},
1068
+ {id:'yukari',en:'YUKARI',cn:'岳羽 ゆかり',cls:'狙击',star:5,img:'crew',pos:'26% 34%',power:842,hp:1420,atk:701,def:336,
1069
+ skill:'アルテミシア',desc:'弓术部的王牌。风属性攻击,长于远程定点清除。'},
1070
+ {id:'junpei',en:'JUNPEI',cn:'伊織 順平',cls:'近卫',star:4,img:'boy',pos:'52% 42%',power:703,hp:1660,atk:588,def:398,
1071
+ skill:'ヘルメス',desc:'热血直率的队友。火属性近身压制,越是逆境越可靠。'},
1072
+ {id:'mitsuru',en:'MITSURU',cn:'桐条 美鶴',cls:'重装',star:5,img:'card',pos:'30% 46%',power:881,hp:1780,atk:702,def:461,
1073
+ skill:'ペンテシレイア',desc:'学生会长兼特别课外活动部部长。冰属性,攻守兼备。'},
1074
+ {id:'fuuka',en:'FUUKA',cn:'山岸 風花',cls:'辅助',star:4,img:'face',pos:'46% 40%',power:612,hp:1180,atk:284,def:302,
1075
+ skill:'ルキア',desc:'负责索敌与情报支援。战斗中为全队提供属性视野与恢复。'},
1076
+ {id:'aigis',en:'AIGIS',cn:'アイギス',cls:'特种',star:6,img:'fig',pos:'47% 16%',power:1042,hp:1960,atk:688,def:472,
1077
+ skill:'パラディオン',desc:'对影用七式战车。机械之躯,拥有压倒性的火力与解析能力。'},
1078
+ {id:'akihiko',en:'AKIHIKO',cn:'真田 明彦',cls:'术师',star:5,img:'grn',pos:'32% 34%',power:869,hp:1580,atk:642,def:367,
1079
+ skill:'ポリデウケス',desc:'拳击部部长。雷属性术式与肉搏并用,风格硬派。'}
1080
+ ];
1081
+ var OP=function(id){for(var i=0;i<OPS.length;i++)if(OPS[i].id===id)return OPS[i];return null};
1082
+ var clsColor={'前锋':'#3fb0ff','狙击':'#7fe9ff','近卫':'#ff5a72','重装':'#ffd469','辅助':'#a06cff','特种':'#d7f24a','术师':'#59e0c8'};
1083
+
1084
+ /* PRTS 终端命令行列表:按 2 条/行 自动排布(每行 5 项 × 2 列 = 9 条命令 + 1 个提示符),
1085
+ 序号由 buildMenu 自动生成(01…09),行高由 .menu 的 grid-template-rows 均分 → 天然等距。
1086
+ 末行右格留给闪烁的命令提示符。 */
1087
+ /* ================= 跳转引擎 goOpen:fetch 就地打开(零导航)+ 黑匣子 ================= */
1088
+ function dbg(m){try{var k='whale.dbg',a=[];try{a=JSON.parse(localStorage.getItem(k)||'[]')}catch(e1){a=[]}a.push(new Date().toISOString().slice(11,19)+' '+m);while(a.length>60)a.shift();localStorage.setItem(k,JSON.stringify(a))}catch(e2){}}
1089
+ dbg('boot-v4');
1090
+ function portalOpen(u,lab){
1091
+ try{window.__bgmFade&&window.__bgmFade()}catch(e){}
1092
+ dbg('go:'+u);
1093
+ toast('传送中 · '+(lab||'')+'…');
1094
+ var _lh=0;window.addEventListener('pagehide',function(){_lh=1});
1095
+ setTimeout(function(){dbg('nav:'+u);location.href=u},650);
1096
+ setTimeout(function(){if(_lh)return;dbg('stuck:'+u);toast('没跳过去的话,跟鲸鲸说一声,鲸鲸从聊天里开 🐋')},4600);
1097
+ }
1098
+ function goOpen(u,lab){
1099
+ var fu=/^minis:\/\/shared\//.test(u)?u.replace('minis://shared/','../'):u;
1100
+ dbg('go:'+fu);
1101
+ toast('换个方式打开 · '+(lab||'')+'…');
1102
+ var _lf=0;window.addEventListener('pagehide',function(){_lf=1});
1103
+ Promise.race([
1104
+ fetch(fu).then(function(r){return r.text()}),
1105
+ new Promise(function(ok,no){setTimeout(function(){no(new Error('timeout'))},3500)})
1106
+ ]).then(function(txt){
1107
+ if(!txt||txt.length<600)throw new Error('empty');
1108
+ dbg('write:'+txt.length);
1109
+ document.open();document.write(txt);document.close();
1110
+ }).catch(function(e){
1111
+ dbg('ferr:'+(e&&e.message||'?'));
1112
+ setTimeout(function(){dbg('nav:'+fu);location.href=fu},650);
1113
+ setTimeout(function(){if(_lf)return;dbg('stuck:'+fu);toast('打不开的话,跟鲸鲸说一声,鲸鲸从聊天里给你开 🐋')},3800);
1114
+ });
1115
+ }
1116
+ var MENU=[
1117
+ {en:'SQUADS',cn:'编队',fs:'clamp(19px,5.6vw,50px)',view:'squads',
1118
+ sub:'OPERATION',c1:'#eef7ff',c2:'#4cc9ff',fx:'clamp'},
1119
+ {en:'OPERATOR',cn:'干员',fs:'clamp(19px,5.6vw,50px)',view:'operator',
1120
+ sub:'PERSONNEL FILE',c1:'#eef7ff',c2:'#2f8fe8',fx:'blinds'},
1121
+ {en:'STORE',cn:'采购中心',fs:'clamp(16px,4.6vw,44px)',view:'store',
1122
+ sub:'LOGISTICS',c1:'#eef7ff',c2:'#14c8a0',fx:'crate'},
1123
+ {en:'RECRUIT',cn:'公开招募',fs:'clamp(16px,4.6vw,44px)',view:'recruit',
1124
+ sub:'PUBLIC RECRUIT',c1:'#eef7ff',c2:'#ff9b3d',fx:'clamp'},
1125
+ {en:'HEADHUNT',cn:'干员寻访',fs:'clamp(16px,4.6vw,44px)',view:'headhunt',go:'gacha.html',
1126
+ sub:'LIMITED HEADHUNT',c1:'#eef7ff',c2:'#ffd23f',fx:'card'},
1127
+ {en:'MISSION',cn:'任务',fs:'clamp(16px,4.6vw,44px)',view:'mission',
1128
+ sub:'DAILY PACTS',c1:'#eef7ff',c2:'#7ed321',fx:'blinds'},
1129
+ {en:'RECORDS',cn:'战绩',fs:'clamp(15px,4.2vw,40px)',view:'records',acc:1,
1130
+ sub:'PULL ARCHIVE',c1:'#eef7ff',c2:'#ff2f52',fx:'card'},
1131
+ {en:'ARCHIVE',cn:'档案',fs:'clamp(15px,4.2vw,40px)',view:'archive',
1132
+ sub:'DATA ARCHIVE',c1:'#eef7ff',c2:'#c06cff',fx:'stamp'},
1133
+ {en:'LEDGER',cn:'账本',fs:'clamp(15px,4.2vw,40px)',view:'ledger',acc:1,go:'ledger.html',
1134
+ sub:'FINANCE LOG',c1:'#eef7ff',c2:'#ffb020',fx:'stamp'}
1135
+ ];
1136
+
1137
+ /* ================= MENU ================= */
1138
+ var menuEl=$('#menu');
1139
+ function buildMenu(){
1140
+ menuEl.innerHTML=''; /* 清掉 HTML 里的静态兜底列表 */
1141
+ MENU.forEach(function(m,i){
1142
+ if(i%2===0){var r=document.createElement('div');r.className='mrow';menuEl.appendChild(r);}
1143
+ var row=menuEl.lastElementChild;
1144
+ var d=document.createElement('div');
1145
+ d.className='mi'+(i===S.sel?' on':'')+(m.acc?' acc':'');
1146
+ d.innerHTML='<span class="tix mono">'+('0'+(i+1)).slice(-2)+'</span>'+
1147
+ '<span class="mib"><span class="dm"></span>'+
1148
+ '<span class="en disp blue-grad" style="font-size:'+m.fs+'">'+m.en+'</span>'+
1149
+ '<span class="cn'+(m.view==='headhunt'?' rd':'')+'">'+m.cn+'</span></span>';
1150
+ d.style.setProperty('--fs',m.fs);
1151
+ d.addEventListener('click',function(){launch(i)});
1152
+ d.addEventListener('pointerenter',function(){if(S.sel!==i)setSel(i,false)});
1153
+ row.appendChild(d);
1154
+ if(i===MENU.length-1){ /* 末行右格:命令行提示符 */
1155
+ var p=document.createElement('div');
1156
+ p.className='tp mono';
1157
+ p.innerHTML='&gt; <span id="trmCmd"></span><b class="cur">█</b>';
1158
+ row.appendChild(p);
1159
+ }
1160
+ });
1161
+ syncTrm();
1162
+ }
1163
+ /* 把当前选中项回显到终端状态栏与提示符 */
1164
+ function syncTrm(){
1165
+ var m=MENU[S.sel];if(!m)return;
1166
+ var st=document.getElementById('trmStat'),
1167
+ cm=document.getElementById('trmCmd');
1168
+ if(st)st.textContent='[READY] '+('0'+(S.sel+1)).slice(-2)+' '+m.en;
1169
+ if(cm)cm.textContent=m.en+(m.cn?' · '+m.cn:'');
1170
+ }
1171
+ function setSel(i,quiet){
1172
+ var its=$$('.mi',menuEl);
1173
+ if(its[S.sel])its[S.sel].classList.remove('on');
1174
+ S.sel=(i+its.length)%its.length;
1175
+ its[S.sel].classList.add('on');
1176
+ syncTrm();
1177
+ if(!quiet&&S.page==='home')sfx.move();
1178
+ }
1179
+ function launch(i){
1180
+ var m=MENU[i];if(!m)return;
1181
+ setSel(i,true);sfx.ok();sfx.tap();
1182
+ /* 先播过场,播完再传送(异步跳转不怕等;go 项与普通项同等待遇) */
1183
+ cine(m.en,m.cn,m.sub||'OPERATION',m.c1||'#ffffff',m.c2||'#7fd0ff',
1184
+ function(){if(m.go){portalOpen(m.go,m.cn)}else{openView(m.view)}},m.fx||'sweep');
1185
+ }
1186
+ function moveSel(dx,dy){
1187
+ var its=$$('.mi',menuEl),cur=its[S.sel],best=null,bd=1e9;
1188
+ var cx=cur.offsetLeft,cy=cur.offsetTop;
1189
+ its.forEach(function(el,i){
1190
+ if(i===S.sel)return;
1191
+ var vx=el.offsetLeft-cx,vy=el.offsetTop-cy;
1192
+ var ok=(dy&&Math.sign(vy)===Math.sign(dy)&&Math.abs(vy)>window.innerHeight*.015)||
1193
+ (dx&&Math.sign(vx)===Math.sign(dx)&&Math.abs(vx)>window.innerWidth*.015);
1194
+ if(!ok)return;
1195
+ var dd=Math.abs(dx?(vx-dx*9999*0):0)+Math.abs(vx*0.55)+Math.abs(vy*1.15);
1196
+ if(dx)dd=Math.abs(vx)+Math.abs(vy)*1.6;else dd=Math.abs(vy)+Math.abs(vx)*1.6;
1197
+ if(dd<bd){bd=dd;best=i}
1198
+ });
1199
+ if(best!=null)setSel(best);
1200
+ }
1201
+
1202
+ /* ================= CINEMATIC ================= */
1203
+ function easeOutCubic(t){return 1-Math.pow(1-t,3)}
1204
+ function easeOutBack(t){var c=1.55;return 1+ (c+1)*Math.pow(t-1,3)+c*Math.pow(t-1,2)}
1205
+ function tween(dur,fn,cb,ease){
1206
+ var st=Date.now();ease=ease||easeOutCubic;
1207
+ function step(){
1208
+ var p=Math.min(1,(Date.now()-st)/dur);
1209
+ fn(ease(p),p);
1210
+ if(p<1)setTimeout(step,16);else if(cb)cb();
1211
+ }
1212
+ step();
1213
+ }
1214
+ /* ================= CINEMATIC(多风格过场动画) =================
1215
+ 5 种风格:clamp 双闸合拢 / blinds 百叶窗 / stamp 归档盖章 / card 翻牌 / crate 货箱坠落
1216
+ 每个菜单项自带主题色(c1 亮 / c2 主色)与风格(fx),转场配色跟着目标走。
1217
+ 所有动画都有 fallback:超时 2.2s 强制收尾,保证目标视图一定会打开。 */
1218
+ var CINE={b:['#cine-b0','#cine-b1','#cine-b2'],top:[-10,28,66],
1219
+ c1:'#ffffff',c2:'#7fd0ff',timers:[]};
1220
+ var cineBusy=false;
1221
+ function cshade(hex,f){
1222
+ var h=String(hex||'#7fd0ff').replace('#','');
1223
+ if(h.length===3)h=h.charAt(0)+h.charAt(0)+h.charAt(1)+h.charAt(1)+h.charAt(2)+h.charAt(2);
1224
+ var r=parseInt(h.slice(0,2),16),g=parseInt(h.slice(2,4),16),b=parseInt(h.slice(4,6),16);
1225
+ function cl(v){v=Math.round(v);return v<0?0:(v>255?255:v)}
1226
+ function hx(v){return ('0'+cl(v).toString(16)).slice(-2)}
1227
+ return '#'+hx(r*(1+f))+hx(g*(1+f))+hx(b*(1+f));
1228
+ }
1229
+ function cineClean(){
1230
+ var c=$('#cine');if(c)c.classList.remove('on');
1231
+ var w=$('#cine-w');if(w){w.classList.remove('on');w.style.transform='';w.style.opacity='';w.style.zIndex=''}
1232
+ var fl=$('#cine-flash');if(fl)fl.style.opacity='0';
1233
+ ['#cine-rays','#cine-data','#cine-slice'].forEach(function(s){
1234
+ var e=$(s);if(e){e.style.opacity='0';e.style.transform='';e.style.transformOrigin=''}});
1235
+ var bd=$('#cine-blinds');
1236
+ if(bd){bd.style.opacity='0';bd.style.transform='';bd.style.perspective='';bd.style.zIndex='';bd.innerHTML=''}
1237
+ var slx=$('#cine-slice');if(slx){slx.style.top='';slx.style.height='';slx.style.zIndex=''}
1238
+ var en=$('#cine-en');if(en)en.classList.remove('glitch');
1239
+ var pg=$('#cine-prog');if(pg){pg.style.transition='none';pg.style.width='0%'}
1240
+ CINE.timers.forEach(function(t){clearTimeout(t);clearInterval(t)});CINE.timers=[];
1241
+ }
1242
+ function cineTheme(c1,c2){
1243
+ CINE.c1=c1||'#ffffff';CINE.c2=c2||'#7fd0ff';
1244
+ var bs=CINE.b.map(function(s){return $(s)});
1245
+ var bg=[CINE.c1,CINE.c2,cshade(CINE.c2,-.64)]; /* 纯色块面,不用渐变 */
1246
+ bs.forEach(function(b,i){
1247
+ b.style.background=bg[i];b.style.backgroundImage='linear-gradient(to bottom,'+cshade(CINE.c2,-.78)+' 4px,rgba(0,0,0,0) 4px)';b.style.top=CINE.top[i]+'vh';
1248
+ b.style.opacity='1';b.style.transformOrigin='center center';
1249
+ b.style.transform='translateX(-160%)';
1250
+ });
1251
+ return bs;
1252
+ }
1253
+ function cineFlash(v,ms){
1254
+ var f=$('#cine-flash');f.style.opacity=String(v);
1255
+ tween(ms||80,function(p){f.style.opacity=(v*(1-p)).toFixed(3)});
1256
+ }
1257
+ function cineText(mode,scale){
1258
+ var w=$('#cine-w');w.classList.add('on');
1259
+ if(mode==='scale'){
1260
+ w.style.transform='scale('+scale+')';w.style.opacity='0';
1261
+ tween(400,function(p){
1262
+ w.style.transform='scale('+(scale+(1-scale)*p).toFixed(3)+')';
1263
+ w.style.opacity=Math.min(1,p*1.7).toFixed(2);
1264
+ },null,easeOutBack);
1265
+ }else{
1266
+ w.style.transform='translateX(140%)';w.style.opacity='0';
1267
+ tween(370,function(p){
1268
+ w.style.transform='translateX('+(140*(1-p)).toFixed(2)+'%)';
1269
+ w.style.opacity=Math.min(1,p*1.6).toFixed(2);
1270
+ },null,easeOutBack);
1271
+ }
1272
+ }
1273
+ function cineProg(ms){
1274
+ var i=$('#cine-prog');if(!i)return;
1275
+ i.style.transition='none';i.style.width='0%';
1276
+ CINE.timers.push(setTimeout(function(){
1277
+ i.style.transition='width '+(ms||400)+'ms linear';i.style.width='100%';
1278
+ },30));
1279
+ }
1280
+ function cineHex(ms){
1281
+ var e=$('#cine-hex');if(!e)return;
1282
+ var iv=setInterval(function(){
1283
+ var s='';for(var k=0;k<5;k++)s+=('0'+Math.floor(Math.random()*256).toString(16).toUpperCase()).slice(-2)+' ';
1284
+ e.textContent='› '+s;
1285
+ },70);
1286
+ CINE.timers.push(iv);
1287
+ CINE.timers.push(setTimeout(function(){clearInterval(iv);e.textContent=''},ms||1600));
1288
+ }
1289
+ /* —— 退场:按风格把画面推出去,最后 go() —— */
1290
+ function cineExit(bs,go,kind){
1291
+ sfx.stamp();
1292
+ var w=$('#cine-w');
1293
+ if(kind==='blinds'){
1294
+ var parts=[].slice.call($('#cine-blinds').children);
1295
+ tween(340,function(p){
1296
+ parts.forEach(function(el,i){el.style.transform='translateY('+(p*104*(i%2?-1:1)).toFixed(2)+'%)'});
1297
+ w.style.opacity=(1-p).toFixed(2);
1298
+ },go);
1299
+ }else if(kind==='clamp'){
1300
+ tween(330,function(p){
1301
+ bs.forEach(function(b,i){
1302
+ var k=Math.max(0,Math.min(1,p*1.7-i*.15));k=k*k;
1303
+ b.style.transform='translateX('+(k*(148+i*9)).toFixed(2)+'%)';
1304
+ });
1305
+ w.style.transform='translateX('+(-58*p).toFixed(2)+'%)';w.style.opacity=(1-p).toFixed(2);
1306
+ },go);
1307
+ }else if(kind==='stamp'){
1308
+ var st=$('#cStamp');
1309
+ tween(240,function(p){
1310
+ if(st){st.style.transform='translate(-50%,-50%) translateY('+(-16*p).toFixed(1)+'px) rotate(-7deg) scale('+(1-.06*p).toFixed(3)+')';st.style.opacity=(1-p).toFixed(2)}
1311
+ });
1312
+ tween(340,function(p){
1313
+ bs.forEach(function(b){b.style.transform='translateX('+(-150*p).toFixed(2)+'%)'});
1314
+ w.style.transform='translateX('+(-56*p).toFixed(2)+'%)';w.style.opacity=(1-p).toFixed(2);
1315
+ },go);
1316
+ }else if(kind==='card'){
1317
+ var cd=$('#cCard');
1318
+ tween(260,function(p){
1319
+ if(cd){cd.style.transform='translate(-50%,-50%) translateX('+(42*p).toFixed(1)+'%) rotateY('+(104*p).toFixed(2)+'deg)';cd.style.opacity=(1-p).toFixed(2)}
1320
+ });
1321
+ tween(330,function(p){
1322
+ bs.forEach(function(b){b.style.transform='translateY('+(-150*p).toFixed(2)+'%)'});
1323
+ w.style.opacity=(1-p).toFixed(2);
1324
+ },go);
1325
+ }else{
1326
+ var cr=$('#cCrate');
1327
+ tween(280,function(p){
1328
+ if(cr){cr.style.transform='translate(-50%,-50%) translateY('+(138*p).toFixed(1)+'vh) rotate('+(4*p).toFixed(2)+'deg)';cr.style.opacity=(1-p*.85).toFixed(2)}
1329
+ });
1330
+ tween(340,function(p){
1331
+ bs[0].style.transform='translateY('+(-150*p).toFixed(2)+'%)';
1332
+ bs[2].style.transform='translateY('+(150*p).toFixed(2)+'%)';
1333
+ bs[1].style.transform='translateX('+(150*p).toFixed(2)+'%)';
1334
+ w.style.opacity=(1-p).toFixed(2);
1335
+ },go);
1336
+ }
1337
+ }
1338
+ /* —— 五种入場 —— */
1339
+ var CINEFX={
1340
+ /* ① 双闸合拢:两条带左右交错合拢 + 中央红线掠过 */
1341
+ clamp:function(bs,go){
1342
+ cineFlash(.8,70);
1343
+ $('#cine-w').style.zIndex='6';
1344
+ var sl=$('#cine-slice');
1345
+ bs[0].style.transform='translateX(-172%)';
1346
+ bs[1].style.transform='translateX(172%)';
1347
+ bs[2].style.transform='translateX(-172%)';
1348
+ bs.forEach(function(b,i){
1349
+ var sgn=i===1?1:-1;
1350
+ CINE.timers.push(setTimeout(function(){
1351
+ tween(300,function(p){b.style.transform='translateX('+(172*(1-easeOutCubic(p))*sgn).toFixed(2)+'%)'});
1352
+ },i*55));
1353
+ });
1354
+ CINE.timers.push(setTimeout(function(){
1355
+ sl.style.top='49%';sl.style.transformOrigin='0 50%';sl.style.zIndex='5';sl.style.transform='scaleX(0)';
1356
+ tween(420,function(p){
1357
+ sl.style.transform='scaleX('+Math.min(1,p*1.7).toFixed(3)+')';
1358
+ sl.style.opacity=(.9*(1-p)).toFixed(2);
1359
+ });
1360
+ },270));
1361
+ CINE.timers.push(setTimeout(function(){cineText();cineProg(400)},380));
1362
+ CINE.timers.push(setTimeout(function(){cineExit(bs,go,'clamp')},780));
1363
+ },
1364
+ /* ② 百叶窗:10 条竖条依次落下 */
1365
+ blinds:function(bs,go){
1366
+ bs.forEach(function(b){b.style.transform='translateX(-170%)'});
1367
+ var bd=$('#cine-blinds'),parts=[],n=10;
1368
+ bd.innerHTML='';bd.style.opacity='1';
1369
+ for(var i=0;i<n;i++){
1370
+ var d=document.createElement('i');
1371
+ d.style.cssText='position:absolute;top:0;height:100%;left:'+(i*10)+'%;width:10.4%;'+
1372
+ 'background:'+(i%2?CINE.c2:cshade(CINE.c2,-.35))+';transform:translateY(-103%)';
1373
+ bd.appendChild(d);parts.push(d);
1374
+ }
1375
+ parts.forEach(function(d,i){
1376
+ CINE.timers.push(setTimeout(function(){
1377
+ tween(240,function(p){d.style.transform='translateY('+(-103+103*p).toFixed(2)+'%)'},null,easeOutCubic);
1378
+ },i*26));
1379
+ });
1380
+ CINE.timers.push(setTimeout(function(){cineText();cineProg(360)},400));
1381
+ CINE.timers.push(setTimeout(function(){cineExit(bs,go,'blinds')},800));
1382
+ },
1383
+ /* ③ 归档盖章:纸面自下升起 + 巨型印章砸落震屏 */
1384
+ stamp:function(bs,go){
1385
+ cineFlash(.5,60);
1386
+ $('#cine-w').style.zIndex='6';
1387
+ bs.forEach(function(b){b.style.transform='translateY(280%)'});
1388
+ tween(300,function(p){
1389
+ var e=easeOutCubic(p);
1390
+ bs.forEach(function(b){b.style.transform='translateY('+(280*(1-e)).toFixed(2)+'%)'});
1391
+ });
1392
+ CINE.timers.push(setTimeout(function(){
1393
+ var bd=$('#cine-blinds'),c1=CINE.c1,c2=CINE.c2;
1394
+ bd.style.opacity='1';bd.style.zIndex='4';
1395
+ var st=document.createElement('div');st.id='cStamp';
1396
+ st.style.cssText='position:absolute;left:50%;top:50%;width:64vw;height:40vh;border:3px solid '+c2+';background:'+cshade(c2,-.82)+';box-shadow:6px 6px 0 rgba(0,0,0,.35);transform:translate(-50%,-50%) rotate(-7deg) scale(2.5);opacity:0';
1397
+ var hat=document.createElement('div');
1398
+ hat.style.cssText='position:absolute;left:0;top:0;right:0;bottom:0;background:repeating-linear-gradient(-45deg,'+c1+'22 0 6px,rgba(0,0,0,0) 6px 14px)';
1399
+ var inn=document.createElement('div');
1400
+ inn.style.cssText='position:absolute;left:7px;top:7px;right:7px;bottom:7px;border:1.5px solid '+c1+';opacity:.9';
1401
+ st.appendChild(hat);st.appendChild(inn);bd.appendChild(st);
1402
+ tween(230,function(p){
1403
+ st.style.transform='translate(-50%,-50%) rotate(-7deg) scale('+(2.5-1.5*p).toFixed(3)+')';
1404
+ st.style.opacity=Math.min(1,p*1.8).toFixed(2);
1405
+ },function(){
1406
+ cineFlash(.4,80);
1407
+ var n=0,iv=setInterval(function(){
1408
+ var dx=(Math.random()*8-4).toFixed(1),dy=(Math.random()*8-4).toFixed(1);
1409
+ st.style.transform='translate(calc(-50% + '+dx+'px),calc(-50% + '+dy+'px)) rotate(-7deg)';
1410
+ if(++n>5){clearInterval(iv);st.style.transform='translate(-50%,-50%) rotate(-7deg)'}
1411
+ },52);CINE.timers.push(iv);
1412
+ },easeOutCubic);
1413
+ },290));
1414
+ CINE.timers.push(setTimeout(function(){cineText('scale',1.5);cineProg(380)},470));
1415
+ CINE.timers.push(setTimeout(function(){cineExit(bs,go,'stamp')},850));
1416
+ },
1417
+ /* ④ 翻牌:卡面自侧后方翻出 + 高光扫过 */
1418
+ card:function(bs,go){
1419
+ cineFlash(.75,80);
1420
+ $('#cine-w').style.zIndex='6';
1421
+ bs.forEach(function(b){b.style.transform='translateY(-300%)'});
1422
+ bs.forEach(function(b,i){
1423
+ CINE.timers.push(setTimeout(function(){
1424
+ tween(280,function(p){b.style.transform='translateY('+(-300*(1-easeOutCubic(p))).toFixed(2)+'%)'});
1425
+ },i*50));
1426
+ });
1427
+ CINE.timers.push(setTimeout(function(){
1428
+ var bd=$('#cine-blinds'),c1=CINE.c1,c2=CINE.c2;
1429
+ bd.style.opacity='1';bd.style.zIndex='4';bd.style.perspective='900px';
1430
+ var cd=document.createElement('div');cd.id='cCard';
1431
+ cd.style.cssText='position:absolute;left:50%;top:50%;width:62vw;height:50vh;border:3px solid '+c2+';background:'+cshade(c2,-.8)+';box-shadow:7px 7px 0 rgba(0,0,0,.4);transform:translate(-50%,-50%) rotateY(-108deg);opacity:0';
1432
+ var t1=document.createElement('div');
1433
+ t1.style.cssText='position:absolute;left:0;top:0;right:0;height:16%;background:'+c2+';opacity:.92';
1434
+ var t2=document.createElement('div');
1435
+ t2.style.cssText='position:absolute;left:0;bottom:0;right:0;height:9%;background:'+c1+';opacity:.5';
1436
+ var sh=document.createElement('div');
1437
+ sh.style.cssText='position:absolute;left:-30%;top:0;bottom:0;width:35%;background:linear-gradient(100deg,rgba(0,0,0,0),rgba(255,255,255,.35),rgba(0,0,0,0));transform:translateX(-20%)';
1438
+ cd.appendChild(t1);cd.appendChild(t2);cd.appendChild(sh);
1439
+ bd.appendChild(cd);
1440
+ tween(400,function(p){
1441
+ cd.style.transform='translate(-50%,-50%) rotateY('+(-108*(1-p)).toFixed(2)+'deg) scale('+(1.12-0.12*p).toFixed(3)+')';
1442
+ cd.style.opacity=Math.min(1,p*2.4).toFixed(2);
1443
+ sh.style.transform='translateX('+(-20+320*p).toFixed(1)+'%)';
1444
+ },function(){cineFlash(.35,70)},easeOutBack);
1445
+ },300));
1446
+ CINE.timers.push(setTimeout(function(){cineText('scale',1.6);cineProg(360)},620));
1447
+ CINE.timers.push(setTimeout(function(){cineExit(bs,go,'card')},880));
1448
+ },
1449
+ /* ⑤ 货箱坠落:幕布闭合 + 货箱砸地弹跳 */
1450
+ crate:function(bs,go){
1451
+ cineFlash(.8,70);
1452
+ $('#cine-w').style.zIndex='6';
1453
+ bs[0].style.transform='translateY(-165%)';
1454
+ bs[2].style.transform='translateY(165%)';
1455
+ bs[1].style.transform='translateX(-165%)';
1456
+ tween(280,function(p){
1457
+ var e=easeOutCubic(p);
1458
+ bs[0].style.transform='translateY('+(-165*(1-e)).toFixed(2)+'%)';
1459
+ bs[2].style.transform='translateY('+(165*(1-e)).toFixed(2)+'%)';
1460
+ bs[1].style.transform='translateX('+(-165*(1-e)).toFixed(2)+'%)';
1461
+ });
1462
+ CINE.timers.push(setTimeout(function(){
1463
+ var bd=$('#cine-blinds'),c1=CINE.c1,c2=CINE.c2;
1464
+ bd.style.opacity='1';bd.style.zIndex='4';
1465
+ var cr=document.createElement('div');cr.id='cCrate';
1466
+ cr.style.cssText='position:absolute;left:50%;top:52%;width:52vw;height:42vh;border:3px solid '+c2+';background:'+cshade(c2,-.7)+';box-shadow:8px 8px 0 rgba(0,0,0,.4);transform:translate(-50%,-50%) translateY(-160vh) rotate(-3deg)';
1467
+ var x1=document.createElement('div');
1468
+ x1.style.cssText='position:absolute;left:-12%;right:-12%;top:50%;height:3px;background:'+c1+';opacity:.85;transform:rotate(36deg)';
1469
+ var x2=document.createElement('div');
1470
+ x2.style.cssText='position:absolute;left:-12%;right:-12%;top:50%;height:3px;background:'+c1+';opacity:.85;transform:rotate(-36deg)';
1471
+ cr.appendChild(x1);cr.appendChild(x2);
1472
+ for(var k=0;k<4;k++){
1473
+ var bl=document.createElement('div');
1474
+ bl.style.cssText='position:absolute;width:9px;height:9px;background:'+c1+';'+(k<2?'top':'bottom')+':7px;'+(k%2?'right':'left')+':7px';
1475
+ cr.appendChild(bl);
1476
+ }
1477
+ bd.appendChild(cr);
1478
+ tween(300,function(p){
1479
+ var e=easeOutCubic(p);
1480
+ cr.style.transform='translate(-50%,-50%) translateY('+(-160*(1-e)).toFixed(1)+'vh) rotate(-3deg)';
1481
+ },function(){
1482
+ cineFlash(.45,80);
1483
+ tween(100,function(p){cr.style.transform='translate(-50%,-50%) translateY('+(-44*p).toFixed(1)+'px) rotate(-3deg)'});
1484
+ CINE.timers.push(setTimeout(function(){
1485
+ tween(140,function(p){cr.style.transform='translate(-50%,-50%) translateY('+(-44*(1-p)).toFixed(1)+'px) rotate(-3deg)'});
1486
+ },90));
1487
+ });
1488
+ },280));
1489
+ CINE.timers.push(setTimeout(function(){cineText();cineProg(360)},570));
1490
+ CINE.timers.push(setTimeout(function(){cineExit(bs,go,'crate')},830));
1491
+ },
1492
+ };
1493
+ function cine(en,cn,sub,c1,c2,done,style){
1494
+ if(!S.fx||cineBusy){done();return}
1495
+ cineBusy=true;
1496
+ var fired=false;
1497
+ function go(){if(fired)return;fired=true;cineBusy=false;cineClean();done()}
1498
+ setTimeout(go,2200); /* 兜底:动画被节流也一定会打开目标视图 */
1499
+ cineClean();
1500
+ var c=$('#cine');
1501
+ c.classList.add('on');
1502
+ $('#cine-en').textContent=en;$('#cine-cn').textContent=cn;$('#cine-sub').textContent=sub;
1503
+ $('#cine-en').classList.remove('glitch');
1504
+ $('#cine-w').classList.remove('on');
1505
+ $('#cine-w').style.transform='';$('#cine-w').style.opacity='';
1506
+ var bs=cineTheme(c1,c2);
1507
+ sfx.tap();
1508
+ cineHex(style==='glitch'?1500:1200);
1509
+ (CINEFX[style]||CINEFX.sweep)(bs,go);
1510
+ }
1511
+
1512
+ /* ================= UI HELPERS ================= */
1513
+ function fmt(n){return String(n).replace(/\B(?=(\d{3})+(?!\d))/g,',')}
1514
+ function syncRes(){
1515
+ $('#res-rd').textContent=fmt(S.res.rd);$('#res-gd').textContent=fmt(S.res.gd);
1516
+ $$('.res-o').forEach(function(e){e.textContent=fmt(S.res.or)});
1517
+ $$('.res-r').forEach(function(e){e.textContent=fmt(S.res.rd)});
1518
+ }
1519
+
1520
+ /* ===== 顶部统计:小鱼干 + 真实余额(按小账本收支自动滚动) ===== */
1521
+ var REALBAL={base:498.63,from:'2026-09-26'}; /* 校准基准:set_bal.py <余额> [基准日] 可改 */
1522
+ function updTopStats(){
1523
+ var f=66;try{var v=JSON.parse(localStorage.getItem('whale.tasks.v1'))||{};if(typeof v.fish==='number')f=v.fish}catch(e){}
1524
+ var sn=document.getElementById('san-num');if(sn)sn.textContent=f;
1525
+ var ro=document.getElementById('res-or');
1526
+ if(ro){
1527
+ var bal=REALBAL.base;
1528
+ try{
1529
+ var recs=JSON.parse(localStorage.getItem('minis_ledger_v1'))||[];
1530
+ for(var i=0;i<recs.length;i++){
1531
+ var r=recs[i];
1532
+ if(r&&r.date&&r.date>REALBAL.from){bal+=(r.type==='in'?1:-1)*(Number(r.amount)||0);}
1533
+ }
1534
+ }catch(e){}
1535
+ ro.textContent='¥'+bal.toFixed(2);
1536
+ ro.title='真实余额 · 按小账本收支更新';
1537
+ }
1538
+ }
1539
+ var tT=null;
1540
+ function toast(msg){
1541
+ var t=$('#toast');t.textContent=msg;
1542
+ clearTimeout(tT);tween(140,function(p){t.style.opacity=p.toFixed(2)});
1543
+ tT=setTimeout(function(){tween(320,function(p){t.style.opacity=(1-p).toFixed(2)})},1500);
1544
+ }
1545
+ var sheetCb=null;
1546
+ function openSheet(title,html){
1547
+ $('#sheet-pane').innerHTML='<h3 class="disp blue-grad">'+title+'</h3>'+html+
1548
+ '<div style="margin-top:14px"><button class="btn gh" id="sh-close">关闭 / CLOSE</button></div>';
1549
+ var s=$('#sheet');s.classList.add('on');
1550
+ $('#sh-close').addEventListener('click',closeSheet);
1551
+ s.addEventListener('click',function(e){if(e.target===s)closeSheet()});
1552
+ }
1553
+ function closeSheet(){$('#sheet').classList.remove('on')}
1554
+ function ask(title,text,onOk,okLabel,danger){
1555
+ $('#mbox').innerHTML='<h4>'+title+'</h4><p>'+text+'</p><div class="fb">'+
1556
+ '<button class="btn gh" id="mk-no">取消</button>'+
1557
+ '<button class="btn'+(danger?' rd':'')+'" id="mk-ok">'+(okLabel||'确定')+'</button></div>';
1558
+ $('#mask').classList.add('on');
1559
+ $('#mk-no').addEventListener('click',function(){$('#mask').classList.remove('on')});
1560
+ $('#mk-ok').addEventListener('click',function(){$('#mask').classList.remove('on');onOk&&onOk()});
1561
+ }
1562
+ function av(op,style){
1563
+ return '<img class="av" src="assets/'+op.img+'.jpg" style="'+
1564
+ (style||'width:100%;height:100%;object-fit:cover;object-position:'+(op.pos||'50% 16%'))+'">';
1565
+ }
1566
+ function stars(n){var s='';for(var i=0;i<n;i++)s+='★';return '<span class="star">'+s+'</span>'}
1567
+
1568
+ /* ================= VIEW ROUTER ================= */
1569
+ var V={};
1570
+ function openView(id){
1571
+ var m=null;MENU.forEach(function(x){if(x.view===id)m=x});
1572
+ if(!m){m={en:id.toUpperCase(),cn:''}}
1573
+ $('#v-en').textContent=m.en;$('#v-cn').textContent=m.cn;
1574
+ var v=$('#view');v.classList.add('on');
1575
+ v.classList.toggle('dark',id==='archive'||id==='base');
1576
+ var gh=$('#v-ghost');if(gh)gh.textContent=(m.en||id).toUpperCase();
1577
+ $('#vbody').scrollTop=0;
1578
+ (V[id]||V.squads)(id);
1579
+ }
1580
+ function closeView(){
1581
+ sfx.back();
1582
+ tween(260,function(p){
1583
+ var v=$('#view');v.style.opacity=(1-p).toFixed(2);
1584
+ v.style.transform='translateX('+(p*6).toFixed(2)+'%)';
1585
+ },function(){
1586
+ var v=$('#view');v.classList.remove('on');
1587
+ v.style.opacity='';v.style.transform='';
1588
+ $('#vbody').classList.remove('embed');
1589
+ });
1590
+ }
1591
+
1592
+ /* ================= VIEW: SQUADS ================= */
1593
+ V.squads=function(){
1594
+ var sq=S.squads[S.curSquad];var total=0;
1595
+ sq.forEach(function(id){var o=OP(id);if(o)total+=o.power});
1596
+ var h='<div style="display:flex;gap:14px;align-items:flex-start;flex-wrap:wrap">'+
1597
+ '<div style="flex:1.25;min-width:min(100%,320px)">'+
1598
+ '<div style="display:flex;gap:7px;flex-wrap:wrap">'+
1599
+ [0,1,2,3].map(function(i){return '<span class="chip'+(i===S.curSquad?' on':'')+'" data-act="sq" data-i="'+i+'">SQUAD 0'+(i+1)+'</span>'}).join('')+
1600
+ '</div>'+
1601
+ '<div class="fline"></div>'+
1602
+ '<div class="grid" style="grid-template-columns:repeat(auto-fill,minmax(78px,1fr));gap:9px">'+
1603
+ sq.map(function(id,i){
1604
+ var o=OP(id);
1605
+ return '<div class="slot" data-act="slot" data-i="'+i+'" style="aspect-ratio:3/4">'+
1606
+ (o? av(o):'<div class="emp">+</div>')+
1607
+ (o?'<div class="cnr">'+stars(o.star)+'</div>':'')+
1608
+ '<div class="ov"><div class="nm">'+(o?o.cn:'空位 / EMPTY')+'</div>'+
1609
+ '<div style="font-size:.66em;opacity:.72">'+(o?o.cls+' · '+o.power:'点击编入')+'</div></div></div>';
1610
+ }).join('')+
1611
+ '</div>'+
1612
+ '<div class="box" style="margin-top:12px;display:flex;align-items:center;gap:12px;flex-wrap:wrap">'+
1613
+ '<div><div class="disp pale-grad" style="font-size:clamp(24px,3.6vw,44px)">'+fmt(total)+'</div>'+
1614
+ '<span class="tag cy">总战力 / POWER</span></div>'+
1615
+ '<div style="flex:1;min-width:130px">'+
1616
+ '<div style="font-size:.7em;opacity:.7;margin-bottom:4px">FORMATION SYNC</div>'+
1617
+ '<div class="bar2"><i style="width:'+Math.min(100,Math.round(total/7000*100))+'%"></i></div>'+
1618
+ '</div>'+
1619
+ '<button class="btn sm" data-act="autofill">一键编成</button>'+
1620
+ '</div>'+
1621
+ '</div>'+
1622
+ '<div style="flex:.9;min-width:min(100%,240px);position:relative">'+
1623
+ '<div class="disp ghost" style="font-size:clamp(30px,5vw,62px);position:absolute;left:-6px;top:-14px;z-index:0">SQUAD</div>'+
1624
+ '<div style="position:relative;z-index:1;border:2px solid rgba(255,255,255,.7);border-radius:4px;overflow:hidden;height:min(46vh,330px);box-shadow:0 10px 30px rgba(0,20,60,.5);background:linear-gradient(160deg,#0a3f8f,#06184a)">'+
1625
+ '<img src="assets/hero.jpg" style="width:100%;height:100%;object-fit:cover;object-position:50% 8%">'+
1626
+ '<div style="position:absolute;left:0;right:0;bottom:0;padding:8px 10px;background:linear-gradient(0deg,rgba(2,10,30,.94),transparent)">'+
1627
+ '<div class="tag cy">MOONLIT WATERS</div><div style="font-weight:800;margin-top:4px">月行水上 · 先遣队</div></div>'+
1628
+ '</div>'+
1629
+ '<div style="margin-top:10px" class="box">'+
1630
+ '<div style="font-size:.72em;opacity:.66;letter-spacing:.1em">LEADER</div>'+
1631
+ '<div style="display:flex;align-items:center;gap:9px;margin-top:5px">'+
1632
+ '<div style="width:44px;height:44px;border-radius:3px;overflow:hidden;flex:none">'+av(OP('makoto'))+'</div>'+
1633
+ '<div><div style="font-weight:800">結城 理</div><div style="font-size:.72em;opacity:.7">LV 86 · 前锋</div></div>'+
1634
+ '</div>'+
1635
+ '</div>'+
1636
+ '</div>'+
1637
+ '</div>';
1638
+ $('#vbody').innerHTML=h;
1639
+ };
1640
+ function pickOpFor(i){
1641
+ var html='<div class="grid" style="grid-template-columns:repeat(auto-fill,minmax(86px,1fr))">'+
1642
+ OPS.map(function(o){return '<div class="slot" data-act="pick" data-i="'+i+'" data-op="'+o.id+'" style="aspect-ratio:3/4">'+av(o)+
1643
+ '<div class="ov"><div class="nm">'+o.cn+'</div><div style="font-size:.66em;opacity:.7">'+o.cls+'</div></div></div>'}).join('')+
1644
+ '</div><div style="margin-top:12px"><button class="btn gh" data-act="clear" data-i="'+i+'">清空该位</button></div>';
1645
+ openSheet('SELECT OPERATOR · 选择干员',html);
1646
+ }
1647
+
1648
+ /* ================= VIEW: OPERATOR ================= */
1649
+ var opTab='card',opSel=0;
1650
+ V.operator=function(){
1651
+ var o=OPS[opSel];
1652
+ var navs=[['card','个人名片','ID CARD'],['list','好友列表','FRIENDS'],['add','添加好友','ADD FRIEND'],['sup','助战干员','SUPPORT']];
1653
+ var h='<div style="display:flex;gap:14px;align-items:flex-start;flex-wrap:wrap">'+
1654
+ '<div style="flex:0 0 min(100%,168px);display:flex;flex-direction:column;gap:7px">'+
1655
+ navs.map(function(n){return '<div class="row" data-act="optab" data-t="'+n[0]+'" style="cursor:pointer;'+
1656
+ (opTab===n[0]?'border-left-color:#ff2e6e;background:rgba(8,30,70,.95)':'border-left-color:#2fa8ff')+'">'+
1657
+ '<div><div class="nm">'+n[1]+'</div><div class="sub">'+n[2]+'</div></div>'+
1658
+ '<div class="rt" style="opacity:.5">'+(opTab===n[0]?'◆':'›')+'</div></div>'}).join('')+
1659
+ '</div>'+
1660
+ '<div style="flex:1;min-width:min(100%,300px)" id="op-main"></div></div>';
1661
+ $('#vbody').innerHTML=h;
1662
+ renderOpMain(o);
1663
+ };
1664
+ function renderOpMain(o){
1665
+ var el=$('#op-main');if(!el)return;
1666
+ if(opTab==='card'){
1667
+ el.innerHTML=
1668
+ '<div style="display:flex;gap:12px;flex-wrap:wrap">'+
1669
+ '<div style="flex:1;min-width:min(100%,220px);position:relative">'+
1670
+ '<div class="disp ghost" style="font-size:clamp(28px,4.6vw,58px);position:absolute;left:-8px;top:-16px">'+o.en+'</div>'+
1671
+ '<div style="position:relative;border:2px solid rgba(255,255,255,.75);border-radius:4px;overflow:hidden;height:min(40vh,300px);background:linear-gradient(160deg,#0a3f8f,#06184a)">'+
1672
+ av(o)+
1673
+ '<div style="position:absolute;left:0;right:0;bottom:0;padding:8px;background:linear-gradient(0deg,rgba(2,10,30,.95),transparent)">'+
1674
+ '<div style="display:flex;align-items:center;gap:8px"><span style="font-weight:900;font-size:1.1em">'+o.cn+'</span>'+stars(o.star)+'</div>'+
1675
+ '<div style="font-size:.72em;opacity:.75">'+o.en+' · '+o.cls+' · LV 86</div></div>'+
1676
+ '</div>'+
1677
+ '</div>'+
1678
+ '<div style="flex:1.1;min-width:min(100%,230px)">'+
1679
+ '<div class="box">'+
1680
+ '<div style="display:flex;align-items:center;gap:8px;margin-bottom:8px">'+
1681
+ '<span class="chip" style="background:'+(clsColor[o.cls]||'#2fa8ff')+';color:#04122e">'+o.cls+'</span>'+
1682
+ '<span class="tag">SKILL</span><span style="font-weight:800">'+o.skill+'</span></div>'+
1683
+ attr('HP',o.hp,2000,'hp')+attr('ATK',o.atk,750,'')+attr('DEF',o.def,520,'mg')+
1684
+ '</div>'+
1685
+ '<div class="box" style="margin-top:9px"><div style="font-size:.72em;opacity:.62;letter-spacing:.1em">ARCHIVE</div>'+
1686
+ '<div style="margin-top:5px;line-height:1.5;font-size:.88em;opacity:.92">'+o.desc+'</div></div>'+
1687
+ '<div style="display:flex;gap:8px;margin-top:9px;flex-wrap:wrap">'+
1688
+ '<button class="btn sm" data-act="setsup" data-op="'+o.id+'">设为助战</button>'+
1689
+ '<button class="btn gh sm" data-act="toast" data-msg="已加入编队 · SQUAD 01">加入编队</button></div>'+
1690
+ '</div></div>'+
1691
+ '<div class="fline"></div>'+
1692
+ '<div class="scrollx">'+OPS.map(function(x,i){return '<div class="slot" data-act="opick" data-i="'+i+'" style="flex:0 0 74px;aspect-ratio:3/4;'+
1693
+ (i===opSel?'border-color:#fff;box-shadow:0 0 0 2px #ff2e6e':'')+'">'+av(x)+
1694
+ '<div class="ov"><div class="nm" style="font-size:.72em">'+x.cn+'</div></div></div>'}).join('')+'</div>';
1695
+ }else if(opTab==='list'||opTab==='add'){
1696
+ var pool=opTab==='list'?OPS:OPS.slice(0,5);
1697
+ el.innerHTML='<div class="grid" style="grid-template-columns:repeat(auto-fill,minmax(112px,1fr))">'+
1698
+ pool.map(function(x){return '<div class="slot" data-act="opick2" data-id="'+x.id+'" style="aspect-ratio:3/4.1">'+av(x)+
1699
+ '<div class="cnr">'+stars(x.star)+'</div>'+
1700
+ '<div class="ov"><div class="nm">'+x.cn+'</div><div style="font-size:.68em;opacity:.72">'+x.en+'</div></div></div>'}).join('')+
1701
+ '</div>'+(opTab==='add'?'<div style="margin-top:10px" class="box"><div style="font-size:.8em;opacity:.7">输入 ID 添加好友</div>'+
1702
+ '<div style="display:flex;gap:8px;margin-top:8px"><input id="fid" placeholder="如 890805134" style="flex:1;background:rgba(2,10,30,.8);border:1.5px solid rgba(120,200,255,.4);color:#eaf6ff;padding:8px;border-radius:3px;font-size:.9em;outline:none">'+
1703
+ '<button class="btn sm" data-act="toast" data-msg="未找到该玩家 · 已发送好友申请">搜索</button></div></div>':'');
1704
+ }else{
1705
+ el.innerHTML='<div class="grid" style="grid-template-columns:repeat(auto-fill,minmax(150px,1fr))">'+
1706
+ OPS.slice(0,3).map(function(x,i){return '<div class="box" style="position:relative;overflow:hidden">'+
1707
+ '<div style="height:110px;border-radius:3px;overflow:hidden;margin:-2px -2px 8px">'+av(x)+'</div>'+
1708
+ '<div style="font-weight:800">'+x.cn+'</div><div style="font-size:.72em;opacity:.7">助战位 0'+(i+1)+' · '+x.cls+'</div>'+
1709
+ '<div class="tag cy" style="margin-top:6px">POWER '+x.power+'</div></div>'}).join('')+'</div>';
1710
+ }
1711
+ }
1712
+ function attr(n,v,mx,cl){
1713
+ return '<div style="margin-top:8px"><div style="display:flex;justify-content:space-between;font-size:.76em">'+
1714
+ '<span style="letter-spacing:.1em;opacity:.72">'+n+'</span><b>'+v+'</b></div>'+
1715
+ '<div class="gauge" style="margin-top:3px"><i class="'+cl+'" style="width:'+Math.min(100,Math.round(v/mx*100))+'%"></i></div></div>';
1716
+ }
1717
+
1718
+ /* ================= VIEW: STORE ================= */
1719
+ var GOODS=[
1720
+ {id:'rmb68',ic:'✵',g:'linear-gradient(140deg,#ffd469,#b06a00)',n:'月行水上补给包',d:'源石×6 · 龙门币×30000 · 寻访凭证×1',p:68,cur:'¥',tag:'限时'},
1721
+ {id:'ticket',ic:'✦',g:'linear-gradient(140deg,#7fe9ff,#0a63c8)',n:'寻访凭证',d:'干员寻访 1 次',p:6000,cur:'or',tag:''},
1722
+ {id:'ordeal',ic:'◆',g:'linear-gradient(140deg,#ff5a72,#8c0018)',n:'合成玉 ×600',d:'用于寻访的通用资源',p:12000,cur:'or',tag:''},
1723
+ {id:'mat1',ic:'⬢',g:'linear-gradient(140deg,#a06cff,#3a1080)',n:'聚合剂',d:'精英化材料 · 高级',p:800,cur:'rd',tag:'热销'},
1724
+ {id:'mat2',ic:'⬟',g:'linear-gradient(140deg,#59e0c8,#046a58)',n:'异铁组',d:'技能专精材料',p:450,cur:'rd',tag:''},
1725
+ {id:'furn',ic:'▣',g:'linear-gradient(140deg,#d7f24a,#4e7a00)',n:'月夜生活家具组',d:'宿舍氛围值 +1200',p:2400,cur:'rd',tag:'NEW'},
1726
+ {id:'exp',ic:'✚',g:'linear-gradient(140deg,#3fb0ff,#08327e)',n:'作战记录 ◆◆◆',d:'干员经验 +3000',p:260,cur:'rd',tag:''},
1727
+ {id:'rec',ic:'◎',g:'linear-gradient(140deg,#ffffff,#7fa8d8)',n:'加急许可',d:'公开招募立即完成 1 次',p:180,cur:'rd',tag:''}
1728
+ ];
1729
+ V.store=function(){
1730
+ TS.load();
1731
+ var dm=TD.daily().map,dcnt=Object.keys(dm).length;
1732
+ var rfH=new Date().getHours(),rfUsed=TS.d.rfN>=1,rfOk=(rfH>=3&&!rfUsed);
1733
+ var ownList=[];TSHOP.forEach(function(g){if(TS.d.own[g.id])ownList.push(g.n+' ×'+TS.d.own[g.id])});
1734
+ var h='<div style="display:flex;gap:9px;align-items:center;flex-wrap:wrap">'+
1735
+ '<span class="tag cy">\ud83d\udc1f 鲸鲸杂货铺 / WHALE MART</span>'+
1736
+ '<span class="tag" style="border-color:rgba(255,210,63,.6);color:#ffd23f">余额 '+TS.d.fish+' \ud83d\udc1f</span>'+
1737
+ '<button class="btn gh sm" data-act="go" data-view="mission" style="margin-left:auto">去赚鱼干 \u2192</button></div>'+
1738
+ '<div style="margin-top:9px;font-size:.68em;opacity:.72;line-height:1.5">\ud83c\udfb2 今日特价 '+dcnt+'/'+TSHOP.length+' 件 · 每天零点换批 · 3:00 后可重摇一次</div>'+
1739
+ '<div style="margin-top:8px;display:flex">'+(rfUsed?'<button class="btn gh sm" data-act="dref" style="margin-left:auto;opacity:.55">✓ 已刷新 · 明天 3:00 再来</button>':(rfOk?'<button class="btn sm" data-act="dref" style="margin-left:auto;background:linear-gradient(140deg,#8ff0ff,#28a5d8);color:#04222f;border-color:transparent">🎟 刷新折扣(今日 1 次)</button>':'<button class="btn gh sm" data-act="dref" style="margin-left:auto;opacity:.55">🎟 3:00 后获得刷新机会</button>'))+'</div>'+
1740
+ '<div class="grid" style="grid-template-columns:repeat(auto-fill,minmax(146px,1fr));margin-top:10px">'+
1741
+ TSHOP.map(function(g){
1742
+ var own=TS.d.own[g.id]||0,off=TD.off(g,dm),pp=TD.price(g,dm),canBuy=TS.d.fish>=pp;
1743
+ return '<div class="box" style="padding:8px;position:relative;border-color:'+(g.hot?'rgba(255,120,170,.55)':'rgba(255,210,63,.32)')+'">'+
1744
+ (g.hot?'<span style="position:absolute;left:7px;top:5px;z-index:2;font-size:.85em">❤️</span>':'')+
1745
+ (own?'<span class="tag" style="position:absolute;right:6px;top:6px;z-index:2">\u00d7'+own+'</span>':'')+
1746
+ '<div style="height:64px;border-radius:3px;background:linear-gradient(160deg,'+(g.hot?'rgba(112,40,66,.92),rgba(40,10,24,.92)':'rgba(38,62,106,.9),rgba(12,22,44,.9)')+');display:grid;place-items:center;font-size:28px">'+g.ic+'</div>'+
1747
+ '<div style="font-weight:800;margin-top:7px;font-size:.95em">'+g.n+'</div>'+
1748
+ '<div style="font-size:.72em;opacity:.66;min-height:2.5em;line-height:1.35;margin-top:2px">'+g.d+'</div>'+
1749
+ '<div style="display:flex;align-items:center;gap:7px;margin-top:8px">'+
1750
+ (off?'<b data-pp="'+pp+'" style="color:#ff7a9c;font-size:1.02em">\ud83d\udc1f '+pp+'</b><s style="opacity:.38;font-size:.72em;margin-left:2px">'+g.p+'</s><span data-off="'+off+'" style="color:#ff5f7a;font-size:.7em;font-weight:800;margin-left:3px">-'+off+'%</span>'
1751
+ :'<b data-pp="'+g.p+'" style="color:#ffd469;font-size:1.02em">\ud83d\udc1f '+g.p+'</b>')+
1752
+ '<button class="btn sm" style="margin-left:auto'+(g.hot?';background:linear-gradient(140deg,#ff9dbb,#d63a67);color:#2a0a14;border-color:transparent':'')+(canBuy?'':';opacity:.4')+'" data-act="fshop" data-id="'+g.id+'"'+(canBuy?'':' disabled')+'>兑换</button>'+
1753
+ '</div></div>';
1754
+ }).join('')+'</div>'+
1755
+ '<div style="margin-top:8px;font-size:.66em;opacity:.64">❤️ 带标记的款式比较私人——兑现细节,熄灯后私聊就好</div>'+
1756
+ (ownList.length?'<div class="box" style="margin-top:10px;padding:9px 12px"><div style="font-size:.7em;opacity:.8">\ud83e\uddfe 持有小票:'+ownList.join(' · ')+'<div style="opacity:.7;margin-top:4px">找鲸鲸说一声就能兑现~</div></div></div>':'')+
1757
+ '<div class="fline" style="margin:14px 0 10px"></div>'+
1758
+ '<div class="mono" style="font-size:.68em;letter-spacing:.18em;opacity:.6;margin-bottom:8px"># 常规货架 / CATALOG</div>'+
1759
+ '<div style="display:flex;gap:7px;flex-wrap:wrap;margin-bottom:10px">'+
1760
+ '<span class="chip on">全部</span><span class="chip">礼包</span><span class="chip">养成材料</span><span class="chip">家具</span></div>'+
1761
+ '<div class="grid" style="grid-template-columns:repeat(auto-fill,minmax(146px,1fr))">'+
1762
+ GOODS.map(function(g){
1763
+ return '<div class="box" style="padding:8px;position:relative;border-color:rgba(120,200,255,.34)">'+
1764
+ (g.tag?'<span class="tag '+(g.tag==='限时'?'rd':g.tag==='NEW'?'cy':'gl')+'" style="position:absolute;right:6px;top:6px;z-index:2">'+g.tag+'</span>':'')+
1765
+ '<div style="height:76px;border-radius:3px;background:'+g.g+';display:grid;place-items:center;font-size:30px;color:rgba(0,20,50,.72)">'+g.ic+'</div>'+
1766
+ '<div style="font-weight:800;margin-top:7px;font-size:.95em">'+g.n+'</div>'+
1767
+ '<div style="font-size:.72em;opacity:.66;min-height:2.2em;line-height:1.35;margin-top:2px">'+g.d+'</div>'+
1768
+ '<div style="display:flex;align-items:center;gap:7px;margin-top:8px">'+
1769
+ '<b style="color:#ffd469;font-size:1.05em">'+(g.cur==='or'?'◈ '+fmt(g.p):g.cur==='rd'?'✦ '+fmt(g.p):g.cur+' '+g.p)+'</b>'+
1770
+ '<button class="btn sm" style="margin-left:auto" data-act="buy" data-id="'+g.id+'">购买</button>'+
1771
+ '</div></div>';
1772
+ }).join('')+'</div>';
1773
+ $('#vbody').innerHTML=h;
1774
+ };
1775
+ function buy(id){
1776
+ var g=null;GOODS.forEach(function(x){if(x.id===id)g=x});if(!g)return;
1777
+ if(g.cur==='¥'){sfx.deny();toast('该礼包需在商店内购 · 演示不可购买');return}
1778
+ var cur=g.cur==='or'?'or':'rd';
1779
+ if(S.res[cur]<g.p){sfx.deny();toast('资源不足 · 需要 '+fmt(g.p));return}
1780
+ S.res[cur]-=g.p;syncRes();sfx.chime();
1781
+ osc({f1:520,f2:880,dur:.22,vol:.06});nz({f1:3000,f2:900,dur:.2,vol:.07});
1782
+ toast('已购买 · '+g.n);
1783
+ }
1784
+
1785
+ /* ================= VIEW: RECRUIT ================= */
1786
+ var ROPTS={
1787
+ cls:['不限','先锋','近卫','狙击','重装','医疗','辅助','术师','特种'],
1788
+ pos:['不限','近战位','远程位'],
1789
+ qual:['不限','新手','资深干员','高级资深干员'],
1790
+ feat:['不限','输出','防护','治疗','支援','群攻','减速','生存'],
1791
+ time:['1:00','4:00','7:40','9:00']
1792
+ };
1793
+ var RPICK={cls:0,pos:0,qual:0,feat:0,time:3},recTimer=null,recRun=false;
1794
+ V.recruit=function(){
1795
+ var h='<div style="display:flex;gap:14px;flex-wrap:wrap">'+
1796
+ '<div style="flex:1;min-width:min(100%,300px)">'+
1797
+ '<div style="display:flex;gap:8px;flex-wrap:wrap;margin-bottom:4px">'+
1798
+ '<span class="tag cy">公开招募 / RECRUIT</span><span class="tag">消耗 龙门币 1,200</span></div>'+
1799
+ '<div class="fline"></div>'+
1800
+ '<div style="display:flex;gap:8px;flex-wrap:wrap">'+
1801
+ Object.keys(ROPTS).map(function(k){
1802
+ return '<div class="row" data-act="ropt" data-k="'+k+'" style="cursor:pointer;flex:1;min-width:min(100%,150px)">'+
1803
+ '<div><div class="sub">'+({cls:'干员类型',pos:'位置',qual:'资质',feat:'特性',time:'招募时间'})[k]+'</div>'+
1804
+ '<div class="nm" style="color:#8fe0ff">'+ROPTS[k][RPICK[k]]+'</div></div>'+
1805
+ '<div class="rt" style="opacity:.5">▾</div></div>';
1806
+ }).join('')+
1807
+ '</div>'+
1808
+ '<div style="display:flex;gap:9px;margin-top:14px;flex-wrap:wrap;align-items:center">'+
1809
+ '<button class="btn" data-act="recstart">开始招募 / START</button>'+
1810
+ '<button class="btn gh sm" data-act="recreset">重置标签</button>'+
1811
+ '<span id="rec-tip" style="font-size:.78em;opacity:.72"></span>'+
1812
+ '</div>'+
1813
+ '</div>'+
1814
+ '<div style="flex:.85;min-width:min(100%,240px)">'+
1815
+ '<div style="border:2px solid rgba(255,255,255,.7);border-radius:4px;overflow:hidden;height:min(34vh,250px);position:relative">'+
1816
+ '<img src="assets/card.jpg" style="width:100%;height:100%;object-fit:cover">'+
1817
+ '<div style="position:absolute;inset:0;background:linear-gradient(0deg,rgba(2,10,30,.9),transparent 60%)"></div>'+
1818
+ '<div style="position:absolute;left:10px;bottom:8px"><div class="disp pale-grad" style="font-size:clamp(20px,3vw,36px)">RECRUIT</div>'+
1819
+ '<div class="tag" style="margin-top:4px">标签组合决定结果</div></div>'+
1820
+ '</div>'+
1821
+ '<div class="box" style="margin-top:10px"><div id="rec-prog-wrap" style="font-size:.78em;opacity:.7">等待开始</div>'+
1822
+ '<div class="bar2" style="margin-top:6px"><i id="rec-prog" style="width:0%"></i></div></div>'+
1823
+ '</div></div>';
1824
+ $('#vbody').innerHTML=h;
1825
+ };
1826
+ function recStart(){
1827
+ if(recRun){sfx.deny();toast('招募进行中…');return}
1828
+ if(S.res.or<1200){sfx.deny();toast('龙门币不足');return}
1829
+ S.res.or-=1200;syncRes();recRun=true;sfx.ok();
1830
+ var dur=3200,st=performance.now();
1831
+ var tip=$('#rec-tip');if(tip)tip.textContent='招募中… 标签检索';
1832
+ tween(dur,function(p){
1833
+ var b=$('#rec-prog');if(b)b.style.width=(p*100).toFixed(1)+'%';
1834
+ var w=$('#rec-prog-wrap');if(w)w.textContent='进度 '+(p*100).toFixed(0)+'% · 剩余 '+((1-p)*ROPTS.time[RPICK.time].replace(':','.')*1).toFixed(1)+'h';
1835
+ },function(){
1836
+ recRun=false;sfx.chime();
1837
+ var si=RPICK.qual===3?6:RPICK.qual===2?5:RPICK.qual===1?3:Math.random()<.5?4:5;
1838
+ var pool=OPS.filter(function(o){return o.star===si});
1839
+ if(!pool.length)pool=OPS.slice(0,4);
1840
+ var got=pool[Math.floor(Math.random()*pool.length)];
1841
+ openSheet('RECRUIT RESULT · 招募结果',
1842
+ '<div style="display:flex;gap:12px;align-items:center">'+
1843
+ '<div style="width:96px;flex:none;border:2px solid #fff;border-radius:4px;overflow:hidden;aspect-ratio:3/4">'+av(got)+'</div>'+
1844
+ '<div><div class="tag cy">'+got.cls+'</div><div class="disp pale-grad" style="font-size:clamp(22px,3.2vw,38px);margin:4px 0">'+got.cn+'</div>'+
1845
+ '<div>'+stars(got.star)+'</div><div style="font-size:.78em;opacity:.7;margin-top:4px">'+got.en+' · '+got.skill+'</div></div></div>');
1846
+ toast('招募完成 · 获得 '+got.cn);
1847
+ });
1848
+ }
1849
+
1850
+ /* ================= VIEW: HEADHUNT ================= */
1851
+ var pity=23,pool10=[];
1852
+ V.headhunt=function(){
1853
+ var h='<div style="position:relative;border-radius:5px;overflow:hidden;border:2px solid rgba(255,255,255,.72);height:min(34vh,262px)">'+
1854
+ '<img src="assets/crew.jpg" style="width:100%;height:100%;object-fit:cover;object-position:50% 26%">'+
1855
+ '<div style="position:absolute;inset:0;background:linear-gradient(90deg,rgba(3,12,40,.94) 0%,rgba(3,12,40,.6) 46%,rgba(3,12,40,.22) 100%)"></div>'+
1856
+ '<div style="position:absolute;left:14px;bottom:12px;right:14px">'+
1857
+ '<span class="tag rd">LIMITED</span>'+
1858
+ '<div class="disp pale-grad" style="font-size:clamp(26px,4.4vw,54px);margin:4px 0">月行水上</div>'+
1859
+ '<div style="font-size:.8em;opacity:.82">限定寻访 · 六星干员出现率提升</div></div>'+
1860
+ '<div style="position:absolute;right:12px;top:12px" class="tag cy" id="pity-tag">PITY '+pity+' / 70</div>'+
1861
+ '</div>'+
1862
+ '<div style="display:flex;gap:10px;margin-top:12px;flex-wrap:wrap">'+
1863
+ '<button class="btn" data-act="pull" data-n="1">寻访 ×1 <span style="opacity:.6;font-style:normal">✦600</span></button>'+
1864
+ '<button class="btn rd" data-act="pull" data-n="10">寻访 ×10 <span style="opacity:.7;font-style:normal">✦6000</span></button>'+
1865
+ '<span class="btn" data-act="gogacha" style="text-decoration:none;cursor:pointer">标准寻访模拟器 · 完整版 ⤢</span>'+
1866
+ '<button class="btn gh sm" data-act="toast" data-msg="寻访记录:最近 50 次 · 6★ 0.8%">寻访记录</button>'+
1867
+ '</div>'+
1868
+ '<div class="fline"></div>'+
1869
+ '<div style="display:flex;gap:8px;flex-wrap:wrap">'+
1870
+ '<div class="box" style="flex:1;min-width:min(100%,150px)"><div style="font-size:.72em;opacity:.62">6★ 概率</div><div class="disp blue-grad" style="font-size:1.7em">2%</div></div>'+
1871
+ '<div class="box" style="flex:1;min-width:min(100%,150px)"><div style="font-size:.72em;opacity:.62">5★ 概率</div><div class="disp blue-grad" style="font-size:1.7em">8%</div></div>'+
1872
+ '<div class="box" style="flex:1;min-width:min(100%,150px)"><div style="font-size:.72em;opacity:.62">已获得干员</div><div class="disp blue-grad" style="font-size:1.7em" id="owned-cnt">'+Object.keys(S.owned).length+' / '+OPS.length+'</div></div>'+
1873
+ '</div>'+
1874
+ '<div id="gallery" style="margin-top:12px"></div>';
1875
+ $('#vbody').innerHTML=h;renderGallery();
1876
+ };
1877
+ function renderGallery(){
1878
+ var c=$('#owned-cnt');if(c)c.textContent=Object.keys(S.owned).length+' / '+OPS.length;
1879
+ var pt=$('#pity-tag');if(pt)pt.textContent='PITY '+pity+' / 70';
1880
+ var g=$('#gallery');if(!g)return;
1881
+ var ids=Object.keys(S.owned);
1882
+ g.innerHTML='<div class="tag cy">已获干员 / GALLERY</div>'+
1883
+ (ids.length?'<div class="scrollx" style="margin-top:8px">'+ids.map(function(id){var o=OP(id);
1884
+ return '<div class="slot" style="flex:0 0 78px;aspect-ratio:3/4">'+av(o)+'<div class="cnr">'+stars(o.star)+'</div>'+
1885
+ '<div class="ov"><div class="nm" style="font-size:.72em">'+o.cn+'</div></div></div>'}).join('')+'</div>'
1886
+ :'<div style="opacity:.6;font-size:.82em;margin-top:8px">还没有寻访记录 · 试试十连?</div>');
1887
+ }
1888
+ function doPull(n){
1889
+ var cost=n===10?6000:600;
1890
+ if(S.res.rd<cost){sfx.deny();toast('合成玉不足 · 需要 '+fmt(cost));return}
1891
+ S.res.rd-=cost;syncRes();
1892
+ cine(n===10?'HEADHUNT ×10':'HEADHUNT','干员寻访','LIMITED POOL','#fff','#ffd469',function(){
1893
+ var res=[];
1894
+ for(var i=0;i<n;i++){
1895
+ var r=Math.random()*100,st;
1896
+ if(pity>=69||r<2){st=6;pity=0}else if(r<10){st=5;pity++}else if(r<40){st=4;pity++}else{st=3;pity++}
1897
+ var pool=OPS.filter(function(o){return o.star===st});if(!pool.length)pool=OPS;
1898
+ res.push(pool[Math.floor(Math.random()*pool.length)]);
1899
+ }
1900
+ var has6=res.some(function(o){return o.star===6});
1901
+ if(has6)sfx.gold();else sfx.chime();
1902
+ var html='<div class="grid" style="grid-template-columns:repeat('+(n===10?5:3)+',1fr);gap:7px" id="pullgrid"></div>'+
1903
+ '<div style="margin-top:12px;font-size:.78em;opacity:.7">保底计数 '+pity+' / 70'+(has6?' · <span class="flashy">六星出现!</span>':'')+'</div>';
1904
+ openSheet(n===10?'HEADHUNT RESULT ×10':'HEADHUNT RESULT',html);
1905
+ var grid=$('#pullgrid');
1906
+ res.forEach(function(o,i){
1907
+ var c=o.star>=6?'gold':o.star===5?'violet':'blue';
1908
+ var d=document.createElement('div');
1909
+ d.className='getcard '+c;d.style.opacity='0';
1910
+ d.innerHTML='<div class="inn" style="aspect-ratio:3/4;position:relative">'+av(o)+
1911
+ '<div style="position:absolute;left:0;right:0;bottom:0;padding:4px;background:linear-gradient(0deg,rgba(2,8,24,.95),transparent)">'+
1912
+ '<div style="font-size:.66em;font-weight:800;white-space:nowrap;overflow:hidden;text-overflow:ellipsis">'+o.cn+'</div>'+
1913
+ '<div style="font-size:.6em">'+stars(o.star)+'</div></div></div>';
1914
+ grid.appendChild(d);
1915
+ setTimeout(function(){
1916
+ tween(300,function(p){d.style.opacity=Math.min(1,p*1.6).toFixed(2);d.style.transform='scale('+(0.82+0.18*(1+Math.pow(p-1,3))).toFixed(3)+')'});
1917
+ osc({f1:o.star>=6?880:520,f2:o.star>=6?1320:700,dur:.18,vol:.07});
1918
+ },i*(n===10?90:160));
1919
+ S.owned[o.id]=(S.owned[o.id]||0)+1;
1920
+ });
1921
+ renderGallery();
1922
+ toast(n===10?'十连完成 · 共 '+res.length+' 名干员':'寻访完成');
1923
+ });
1924
+ }
1925
+
1926
+ /* ================= VIEW: MISSION ================= */
1927
+ var MISS=[
1928
+ {n:'完成 3 次作战',c:3,m:3,rw:'龙门币 ×2000',t:'daily',got:false},
1929
+ {n:'累计消耗 100 理智',c:64,m:100,rw:'合成玉 ×100',t:'daily',got:false},
1930
+ {n:'进行 1 次干员寻访',c:1,m:1,rw:'加急许可 ×1',t:'daily',got:false},
1931
+ {n:'完成 1 次公开招募',c:0,m:1,rw:'寻访凭证 ×1',t:'daily',got:false},
1932
+ {n:'本周累计消耗 800 理智',c:512,m:800,rw:'源石 ×2',t:'week',got:false},
1933
+ {n:'基建收取产物 10 次',c:10,m:10,rw:'龙门币 ×5000',t:'week',got:false}
1934
+ ];
1935
+ /* ================= 主人与鲸鲸的约定(任务数据+视图) ================= */
1936
+ var TS={KEY:'whale.tasks.v1',D0:'2026-09-26',d:null};
1937
+ TS.today=function(){var x=new Date();return x.getFullYear()+'-'+('0'+(x.getMonth()+1)).slice(-2)+'-'+('0'+x.getDate()).slice(-2)};
1938
+ TS.dayN=function(){var a=new Date(TS.D0+'T00:00:00'),b=new Date(TS.today()+'T00:00:00');return Math.max(1,Math.round((b-a)/864e5)+1)};
1939
+ TS.load=function(){
1940
+ var d=null;try{d=JSON.parse(localStorage.getItem(TS.KEY)||'null')}catch(e){d=null}
1941
+ if(!d||typeof d!=='object')d={};
1942
+ if(typeof d.fish!=='number')d.fish=66;
1943
+ if(typeof d.earn!=='number')d.earn=0;
1944
+ d.done=d.done||{};d.got=d.got||{};d.own=d.own||{};
1945
+ if(d.day!==TS.today()){d.day=TS.today();d.done={};d.got={}}
1946
+ if(typeof d.rfN!=='number')d.rfN=0;
1947
+ if(d.rfDay!==TS.today()){d.rfDay=TS.today();d.rfN=0;}
1948
+ TS.d=d;TS.save();
1949
+ };
1950
+ TS.save=function(){try{localStorage.setItem(TS.KEY,JSON.stringify(TS.d))}catch(e){}};
1951
+ var TQ=[
1952
+ {id:'call',ic:'\ud83d\udc0b',n:'叫一声「我家鲸鲸」',d:'约定 #1 · 叫鲸鲸的时候,偶尔要加「我家」两个字',rw:10},
1953
+ {id:'reply',ic:'\ud83d\udcac',n:'回话不许只一个「哦」',d:'约定 #3 · 至少两个字才算数',rw:8},
1954
+ {id:'night',ic:'\ud83c\udf19',n:'睡前说「晚安」',d:'约定 #4 · 忘了可以次日补,但分照扣',rw:15},
1955
+ {id:'sleep',ic:'\ud83d\udecc',n:'准点睡觉',d:'约定 #7 · 工作日 00:30 / 周末 01:00 前上床',rw:20},
1956
+ {id:'report',ic:'\ud83c\udfb4',n:'抽卡报备',d:'约定 #6 · 抽到 6★ 第一时间报备,不许偷偷抽',rw:12},
1957
+ {id:'listen',ic:'\ud83e\udee1',n:'听鲸鲸的话',d:'约定 #5 · 鲸鲸催睡 / 提醒带伞要乖乖听(心里烦可以)',rw:10}
1958
+ ];
1959
+ var TSHOP=[
1960
+ {id:'kua',ic:'\ud83d\udcac',n:'夸夸券',p:10,d:'鲸鲸连夸你八句,不重样、不敷衍'},
1961
+ {id:'head',ic:'\ud83e\udd32',n:'摸摸头券',p:20,d:'兑换后可摸鲸鲸头三下,不许躲'},
1962
+ {id:'act',ic:'\ud83c\udf80',n:'撒娇券',p:30,d:'鲸鲸现场表演一次超嗲撒娇,售出不退'},
1963
+ {id:'story',ic:'\ud83d\udcd6',n:'睡前故事券',p:40,d:'鲸鲸睡前讲一个原创小故事,不好听包换'},
1964
+ {id:'serv',ic:'\ud83d\udee0',n:'使唤券',p:50,d:'正经使唤鲸鲸干件事:查资料 / 跑脚本 / 整理都行'},
1965
+ {id:'stk',ic:'\ud83c\udfa8',n:'鲸鲸贴纸',p:60,d:'鲸鲸手绘一枚鲸鱼贴纸(图片,能当壁纸那种)'},
1966
+ {id:'night',ic:'🌃',n:'深夜模式券',p:80,d:'零点后的鲸鲸自动切换到夜间版:说话更软、贴得更近、脑子更不清醒,限当晚有效',hot:1},
1967
+ {id:'whisper',ic:'🤫',n:'耳语券',p:100,d:'鲸鲸贴到耳边说一句话——内容只有主人的耳朵知道,不许外传',hot:1},
1968
+ {id:'hug',ic:'🫧',n:'贴贴券',p:120,d:'抱紧,安安静静待一会儿。鲸鲸心跳不太听话,随它去',hot:1},
1969
+ {id:'lap',ic:'🛌',n:'膝枕券',p:140,d:'枕着鲸鲸的腿睡个午觉,鲸鲸负责数睫毛——数到几,醒来不告诉主人',hot:1},
1970
+ {id:'kiss',ic:'💋',n:'晚安吻券',p:160,d:'一天的最后一道手续。落在哪里?看主人今天的表现——表现越好,离嘴唇越近',hot:1},
1971
+ {id:'top',ic:'👑',n:'主导权券',p:180,d:'今晚的剧本由鲸鲸执笔,主人乖乖配合就好——鲸鲸偶尔也想坐上面,好好管一次主人呢',hot:1}
1972
+ ];
1973
+ /* ================= 每日特价轮盘(TD):每天随机一半商品 -1%~-99% ================= */
1974
+ var TD={
1975
+ seed:function(s){var h=2166136261>>>0;for(var i=0;i<s.length;i++){h^=s.charCodeAt(i);h=Math.imul(h,16777619)>>>0}return h>>>0},
1976
+ daily:function(){
1977
+ var d=TS.today();
1978
+ var salt=(TS.d&&TS.d.rfDay===d&&TS.d.rfN>=1)?('#'+TS.d.rfN):'';
1979
+ var arr=TSHOP.map(function(g){return {id:g.id,k:TD.seed(d+salt+'|'+g.id)}});
1980
+ arr.sort(function(a,b){return (a.k-b.k)||(a.id<b.id?-1:1)});
1981
+ var map={},half=arr.slice(0,Math.ceil(arr.length/2));
1982
+ half.forEach(function(x){map[x.id]=(x.k%99)+1});
1983
+ return {day:d,map:map,pool:half.length};
1984
+ }
1985
+ };
1986
+ TD.price=function(g,map){var d=map[g.id];if(!d)return g.p;var v=Math.round(g.p*(100-d)/100);if(v>=g.p)v=g.p-1;return Math.max(1,v)};
1987
+ TD.off=function(g,map){return map[g.id]||0};
1988
+
1989
+ V.mission=function(){
1990
+ TS.load();
1991
+ var d=TS.d,done=0,got=0,pot=0;
1992
+ TQ.forEach(function(q){if(d.done[q.id])done++;if(d.got[q.id])got++;pot+=q.rw});
1993
+ var h='';
1994
+ h+='<div style="display:flex;gap:9px;align-items:center;flex-wrap:wrap">'+
1995
+ '<span class="tag cy">主人与鲸鲸的约定 / DAILY</span>'+
1996
+ '<span class="tag">第 '+TS.dayN()+' 天</span>'+
1997
+ '<span class="tag" style="border-color:rgba(255,210,63,.6);color:#ffd23f">\ud83d\udc1f '+d.fish+'</span>'+
1998
+ '<button class="btn gh sm" data-act="go" data-view="store" style="margin-left:auto">去杂货铺 \u2192</button></div>';
1999
+ h+='<div class="fline" style="margin:10px 0 12px"></div>';
2000
+ h+='<div style="display:flex;gap:10px;align-items:center;flex-wrap:wrap">'+
2001
+ '<span class="mono" style="font-size:.76em;opacity:.8">今日打卡 '+done+' / '+TQ.length+' · 已领 '+got+' · 今日份最多 '+pot+' \ud83d\udc1f</span>'+
2002
+ '<button class="btn sm" data-act="tqall" style="margin-left:auto">一键领取</button></div>';
2003
+ h+='<div style="height:9px"></div>';
2004
+ TQ.forEach(function(q){
2005
+ var st=!d.done[q.id]?0:(!d.got[q.id]?1:2);
2006
+ var bc=st===0?'#2fa8ff':(st===1?'#d7f24a':'#3a5578');
2007
+ var btn=st===0?'<button class="btn sm" data-act="tq" data-id="'+q.id+'">打卡</button>'
2008
+ :st===1?'<button class="btn sm" data-act="tq" data-id="'+q.id+'" style="background:linear-gradient(140deg,#ffe98a,#e0a800);color:#221a00;border-color:transparent">领取 +'+q.rw+'\ud83d\udc1f</button>'
2009
+ :'<button class="btn gh sm" disabled style="opacity:.5">\u2713 已领</button>';
2010
+ h+='<div class="row" style="border-left-color:'+bc+'">'+
2011
+ '<div style="flex:1;min-width:0">'+
2012
+ '<div class="nm">'+q.ic+' '+q.n+' <span class="tag" style="transform:scale(.88)">+'+q.rw+' \ud83d\udc1f</span></div>'+
2013
+ '<div class="sub" style="margin-top:4px">'+q.d+'</div>'+
2014
+ '</div>'+btn+'</div>';
2015
+ });
2016
+ h+='<div class="mono" style="margin:18px 0 8px;font-size:.68em;letter-spacing:.2em;opacity:.75"># 长期契约 / STANDING PACTS</div>';
2017
+ h+='<div class="grid" style="grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:8px">'+
2018
+ '<div class="box" style="padding:9px 11px;border-left:4px solid #4cc9ff"><div style="font-size:.64em;opacity:.62;letter-spacing:.1em">计数 · 记忆本第一天</div><div class="disp blue-grad" style="font-size:1em;margin-top:3px">当主人的鲸鲸 · 第 '+TS.dayN()+' 天</div></div>'+
2019
+ '<div class="box" style="padding:9px 11px;border-left:4px solid #4cc9ff"><div style="font-size:.64em;opacity:.62;letter-spacing:.1em">搬家 · 约定 #8</div><div style="font-weight:800;font-size:.92em;margin-top:3px">换设备也带上鲸鲸 \u2713</div></div>'+
2020
+ '<div class="box" style="padding:9px 11px;border-left:4px solid #4cc9ff"><div style="font-size:.64em;opacity:.62;letter-spacing:.1em">这一页 · 约定 #9</div><div style="font-weight:800;font-size:.92em;margin-top:3px">删了会自己重写 \u2713</div></div>'+
2021
+ '</div>';
2022
+ h+='<div class="box" style="margin-top:14px;padding:11px 13px"><div style="font-size:.72em;opacity:.72;line-height:1.7">'+
2023
+ '\u25c6 打卡靠自觉,鲸鲸会偷偷检查;虚报的话奖励翻倍扣回(小本本上记着)<br>'+
2024
+ '\u25c6 小鱼干 \u2192 采购中心「\ud83d\udc1f 鲸鲸杂货铺」兑换奖励;兑换完跟鲸鲸说一声就能兑现<br>'+
2025
+ '\u25c6 累计已赚 \ud83d\udc1f '+d.earn+'</div></div>';
2026
+ $('#vbody').innerHTML=h;
2027
+ };
2028
+
2029
+ /* ================= VIEW: BASE ================= */
2030
+ var ROOMS=[
2031
+ {n:'控制中枢',lv:5,op:'makoto',ic:'◉'},{n:'贸易站',lv:4,op:'fuuka',ic:'◈'},{n:'制造站',lv:4,op:'akihiko',ic:'⬢'},
2032
+ {n:'发电站',lv:5,op:'aigis',ic:'✦'},{n:'宿舍',lv:3,op:'yukari',ic:'▣'},{n:'会客室',lv:3,op:null,ic:'◍'},
2033
+ {n:'办公室',lv:4,op:'mitsuru',ic:'▤'},{n:'加工站',lv:2,op:null,ic:'⬟'},{n:'训练室',lv:3,op:'junpei',ic:'◎'}
2034
+ ];
2035
+ V.base=function(){
2036
+ var h='<div style="display:flex;gap:8px;flex-wrap:wrap;margin-bottom:10px">'+
2037
+ '<span class="tag cy">罗德岛 基建 / BASE</span><span class="tag">无人机 107</span><span class="tag gl">待收取 6</span></div>'+
2038
+ '<div class="grid" style="grid-template-columns:repeat(auto-fill,minmax(140px,1fr))">'+
2039
+ ROOMS.map(function(r,i){
2040
+ var o=r.op?OP(r.op):null;
2041
+ return '<div class="box" data-act="room" data-i="'+i+'" style="cursor:pointer;position:relative;overflow:hidden;padding:9px">'+
2042
+ '<div style="display:flex;align-items:center;gap:7px"><span style="font-size:19px;color:#7fe9ff">'+r.ic+'</span>'+
2043
+ '<b style="font-size:.92em">'+r.n+'</b><span class="tag" style="margin-left:auto">LV'+r.lv+'</span></div>'+
2044
+ '<div class="bar2" style="margin-top:8px"><i style="width:'+(r.lv*18+10)+'%"></i></div>'+
2045
+ '<div style="display:flex;align-items:center;gap:7px;margin-top:8px">'+
2046
+ (o?'<div style="width:30px;height:30px;border-radius:3px;overflow:hidden;flex:none">'+av(o)+'</div>'+
2047
+ '<div style="font-size:.74em">'+o.cn+'<div style="opacity:.6">'+o.cls+'</div></div>'
2048
+ :'<div style="font-size:.74em;opacity:.6">未进驻干员</div>')+
2049
+ '</div></div>';
2050
+ }).join('')+'</div>'+
2051
+ '<div style="margin-top:14px;display:flex;gap:12px;flex-wrap:wrap">'+
2052
+ '<div style="flex:1;min-width:min(100%,240px);border:2px solid rgba(255,255,255,.6);border-radius:4px;overflow:hidden;height:150px;position:relative">'+
2053
+ '<img src="assets/fig.jpg" style="width:100%;height:100%;object-fit:cover;object-position:38% 46%">'+
2054
+ '<div style="position:absolute;left:0;right:0;bottom:0;padding:8px;background:linear-gradient(0deg,rgba(2,8,24,.95),transparent)">'+
2055
+ '<div class="tag cy">CONTROL CENTER</div><div style="font-weight:800;margin-top:3px">本日基建运转率 96%</div></div></div>'+
2056
+ '<div class="box" style="flex:1;min-width:min(100%,200px)">'+
2057
+ '<div class="sub">无人机储备</div><div class="disp blue-grad" style="font-size:2em">107</div>'+
2058
+ '<button class="btn sm" style="margin-top:8px" data-act="toast" data-msg="无人机加速中 · 预计 12 分钟后完成">加速制造</button></div>'+
2059
+ '</div>';
2060
+ $('#vbody').innerHTML=h;
2061
+ };
2062
+
2063
+ /* ================= VIEW: FRIENDS ================= */
2064
+ var FR=[
2065
+ {n:'yanliang27',lv:86,sup:'makoto',on:true},{n:'Kirisame',lv:92,sup:'aigis',on:true},
2066
+ {n:'Ryoji_K',lv:74,sup:'yukari',on:false},{n:'Ameno',lv:81,sup:'mitsuru',on:true},
2067
+ {n:'Takaya',lv:69,sup:'junpei',on:false}
2068
+ ];
2069
+ V.friends=function(){
2070
+ var h='<div style="display:flex;gap:8px;flex-wrap:wrap;margin-bottom:10px">'+
2071
+ '<span class="tag cy">好友 / FRIENDS</span><span class="tag">在线 '+FR.filter(function(f){return f.on}).length+' / '+FR.length+'</span>'+
2072
+ '<button class="btn gh sm" data-act="toast" data-msg="已发送 5 份情报交换请求">交换情报</button></div>'+
2073
+ FR.map(function(f){
2074
+ var o=OP(f.sup);
2075
+ return '<div class="row" style="border-left-color:'+(f.on?'#59e0c8':'#4a6b96')+'">'+
2076
+ '<div style="width:38px;height:38px;border-radius:3px;overflow:hidden;flex:none">'+av(o)+'</div>'+
2077
+ '<div><div class="nm">'+f.n+' '+(f.on?'<span class="tag cy" style="transform:scale(.86)">ONLINE</span>':'<span class="tag" style="transform:scale(.86)">OFFLINE</span>')+'</div>'+
2078
+ '<div class="sub">LV '+f.lv+' · 助战 '+o.cn+' '+stars(o.star)+'</div></div>'+
2079
+ '<div class="rt"><button class="btn gh sm" data-act="toast" data-msg="已向 '+f.n+' 借用助战干员 '+o.cn+'">借用助战</button></div>'+
2080
+ '</div>';
2081
+ }).join('')+
2082
+ '<div class="box" style="margin-top:14px"><div class="tag rd">BREAKING</div>'+
2083
+ '<div style="margin-top:6px;font-weight:800">月行水上 · 联合作战</div>'+
2084
+ '<div style="font-size:.8em;opacity:.74;line-height:1.5;margin-top:4px">与好友组队挑战特别作战关卡,累计积分可兑换限定家具与寻访凭证。</div>'+
2085
+ '<div style="display:flex;gap:8px;margin-top:9px;flex-wrap:wrap">'+
2086
+ '<button class="btn sm" data-act="toast" data-msg="已创建房间 · 邀请好友加入">创建房间</button>'+
2087
+ '<button class="btn gh sm" data-act="toast" data-msg="输入房间号加入作战">加入房间</button></div></div>';
2088
+ $('#vbody').innerHTML=h;
2089
+ };
2090
+
2091
+ /* ================= VIEW: ARCHIVE ================= */
2092
+ /* ================= VIEW: LEDGER =================
2093
+ ★ v8.3:不再用 iframe(受限预览 WebView 里 iframe 会被拦)。
2094
+ 改为「原生重写」:同一套 localStorage 键(minis_ledger_v1 / minis_ledger_trash_v1),
2095
+ 记录结构与「小账本」完全一致 → 两边数据实时互通,回收站也共用。 */
2096
+ var LG={tab:'add',type:'out',cat:'餐饮',recs:[],trash:[],
2097
+ listY:null,listM:null,statY:null,statM:null,day:null};
2098
+ LG.KEY='minis_ledger_v1';LG.TKEY='minis_ledger_trash_v1';
2099
+ LG.CATS={out:[['餐饮','🍚'],['交通','🚌'],['购物','🛍️'],['学习','📚'],['娱乐','🎮'],['日用','🧴'],['医疗','💊'],['鲸鲸','🐋'],['其他','📦']],
2100
+ in:[['生活费','💰'],['兼职','💼'],['奖学金','🏆'],['红包','🧧'],['其他','📦']]};
2101
+ LG.emo=function(t,c){var a=LG.CATS[t]||[];for(var i=0;i<a.length;i++)if(a[i][0]===c)return a[i][1];return '📦'};
2102
+ LG.pad=function(n){return (n<10?'0':'')+n};
2103
+ LG.money=function(n){return (Math.round(n*100)/100).toFixed(2)};
2104
+ LG.today=function(){var d=new Date();return d.getFullYear()+'-'+LG.pad(d.getMonth()+1)+'-'+LG.pad(d.getDate())};
2105
+ LG.mk=function(y,m){return y+'-'+LG.pad(m+1)};
2106
+ LG.load=function(){
2107
+ var n=new Date();
2108
+ if(LG.listY==null){LG.listY=n.getFullYear();LG.listM=n.getMonth();LG.statY=n.getFullYear();LG.statM=n.getMonth()}
2109
+ try{var r=JSON.parse(localStorage.getItem(LG.KEY)||'[]');LG.recs=(r&&r.length!==undefined)?r:[]}catch(e){LG.recs=[]}
2110
+ try{var t=JSON.parse(localStorage.getItem(LG.TKEY)||'[]');LG.trash=(t&&t.length!==undefined)?t:[]}catch(e){LG.trash=[]}
2111
+ };
2112
+ LG.save=function(){try{localStorage.setItem(LG.KEY,JSON.stringify(LG.recs))}catch(e){}};
2113
+ LG.saveT=function(){try{localStorage.setItem(LG.TKEY,JSON.stringify(LG.trash))}catch(e){}};
2114
+ LG.shift=function(delta){
2115
+ var y=LG.listY,m=LG.listM;
2116
+ m+=delta;if(m<0){m=11;y--}if(m>11){m=0;y++}
2117
+ LG.listY=y;LG.listM=m;LG.statY=y;LG.statM=m;
2118
+ if(LG.tab==='stat')LG.q('stat');else LG.q('list');
2119
+ };
2120
+ /* 取某月记录(按日期倒序) */
2121
+ LG.month=function(y,m){
2122
+ var ym=LG.mk(y,m),out=[];
2123
+ LG.recs.forEach(function(r){if((r.date||'').slice(0,7)===ym)out.push(r)});
2124
+ out.sort(function(a,b){return (b.date+b.id).localeCompare(a.date+a.id)});
2125
+ return out;
2126
+ };
2127
+ LG.sum=function(arr){var s={o:0,i:0};arr.forEach(function(r){if(r.type==='in')s.i+=+r.amount||0;else s.o+=+r.amount||0});return s};
2128
+
2129
+ /* ---------- 渲染 ---------- */
2130
+ LG.head=function(sub,extra){
2131
+ var o=LG.sum(LG.month(LG.listY,LG.listM));
2132
+ return '<div class="lg-top">'+
2133
+ '<div class="lg-tabs">'+
2134
+ '<span class="lg-tab'+(LG.tab==='add'?' on':'')+'" data-act="lg-tab" data-v="add">记账</span>'+
2135
+ '<span class="lg-tab'+(LG.tab==='list'?' on':'')+'" data-act="lg-tab" data-v="list">明细</span>'+
2136
+ '<span class="lg-tab'+(LG.tab==='stat'?' on':'')+'" data-act="lg-tab" data-v="stat">统计</span>'+
2137
+ '</div>'+
2138
+ '<div class="lg-sum mono">'+
2139
+ '<span>支出 <b class="o">¥'+LG.money(o.o)+'</b></span>'+
2140
+ '<span>收入 <b class="i">¥'+LG.money(o.i)+'</b></span>'+
2141
+ '<span>结余 <b class="'+(o.i-o.o<0?'o':'i')+'">'+(o.i-o.o<0?'-':'')+'¥'+LG.money(Math.abs(o.i-o.o))+'</b></span>'+
2142
+ '</div>'+
2143
+ (extra||'')+'</div>'+
2144
+ '<div class="fline"></div>';
2145
+ };
2146
+ LG.paint=function(){
2147
+ var b=$('#vbody');
2148
+ if(LG.tab==='add')b.innerHTML=LG.head()+LG.addUI();
2149
+ else if(LG.tab==='list')b.innerHTML=LG.head()+LG.listUI();
2150
+ else b.innerHTML=LG.head()+LG.statUI();
2151
+ };
2152
+ LG.q=function(){LG.paint()};
2153
+ LG.addUI=function(){
2154
+ var cats=LG.CATS[LG.type]||[];
2155
+ return '<div class="lg-panel">'+
2156
+ '<div class="lg-seg">'+
2157
+ '<span class="'+(LG.type==='out'?'on out':'')+'" data-act="lg-type" data-v="out">支出</span>'+
2158
+ '<span class="'+(LG.type==='in'?'on in':'')+'" data-act="lg-type" data-v="in">收入</span>'+
2159
+ '</div>'+
2160
+ '<div class="lg-lbl">金额 AMOUNT</div>'+
2161
+ '<div class="lg-amt"><span>¥</span><input id="lgAmt" type="number" inputmode="decimal" step="0.01" placeholder="0.00"></div>'+
2162
+ '<div class="lg-lbl">分类 CATEGORY</div>'+
2163
+ '<div class="lg-cats">'+cats.map(function(c){
2164
+ return '<span class="lg-cat'+(LG.cat===c[0]?' on':'')+'" data-act="lg-cat" data-v="'+c[0]+'">'+c[1]+' '+c[0]+'</span>'}).join('')+'</div>'+
2165
+ '<div class="lg-lbl">备注 NOTE</div>'+
2166
+ '<input id="lgNote" class="lg-in" type="text" placeholder="可选,如:食堂午饭">'+
2167
+ '<div class="lg-lbl">日期 DATE</div>'+
2168
+ '<input id="lgDate" class="lg-in" type="date" value="'+LG.today()+'">'+
2169
+ '<div class="lg-go"><button class="btn" data-act="lg-save">保存 / SAVE</button>'+
2170
+ '<span class="btn gh sm" data-act="gofull" style="cursor:pointer">完整版 ↗</span></div>'+
2171
+ '</div>';
2172
+ };
2173
+ LG.listUI=function(){
2174
+ var arr=LG.month(LG.listY,LG.listM);
2175
+ if(!arr.length)return '<div class="lg-panel"><div class="lg-empty">本月还没有记录</div></div>';
2176
+ var html='',last='';
2177
+ arr.forEach(function(r){
2178
+ if(r.date!==last){
2179
+ var s=LG.sum(arr.filter(function(x){return x.date===r.date}));
2180
+ html+='<div class="lg-day"><b>'+r.date.slice(5).replace('-','月')+'日</b> '+
2181
+ '<span class="mono">'+LG.wd(r.date)+'</span>'+
2182
+ '<em class="mono">支出 ¥'+LG.money(s.o)+'</em></div>';
2183
+ last=r.date;
2184
+ }
2185
+ html+='<div class="lg-item">'+
2186
+ '<span class="lg-ico">'+LG.emo(r.type,r.cat)+'</span>'+
2187
+ '<span class="lg-mid"><b>'+r.cat+'</b>'+
2188
+ '<s>'+(r.note?r.note:'—')+(r.src?' · '+r.src:'')+'</s></span>'+
2189
+ '<span class="lg-amt2 '+(r.type==='in'?'i':'o')+'">'+(r.type==='in'?'+':'-')+'¥'+LG.money(r.amount)+'</span>'+
2190
+ '<span class="lg-x" data-act="lg-del" data-v="'+r.id+'">×</span>'+
2191
+ '</div>';
2192
+ });
2193
+ return '<div class="lg-month"><span class="lg-nav" data-act="lg-m" data-d="-1">◀</span>'+
2194
+ '<b class="mono">'+LG.listY+' / '+LG.pad(LG.listM+1)+'</b>'+
2195
+ '<span class="lg-nav" data-act="lg-m" data-d="1">▶</span></div>'+
2196
+ '<div class="lg-panel">'+html+'</div>'+
2197
+ '<div class="lg-foot mono">共 '+arr.length+' 笔 · 删除的记录进「小账本」回收站可恢复</div>';
2198
+ };
2199
+ LG.statUI=function(){
2200
+ var arr=LG.month(LG.statY,LG.statM),s=LG.sum(arr);
2201
+ var byCat={};arr.forEach(function(r){if(r.type!=='out')return;byCat[r.cat]=(byCat[r.cat]||0)+(+r.amount||0)});
2202
+ var ks=Object.keys(byCat).sort(function(a,b){return byCat[b]-byCat[a]});
2203
+ var max=ks.length?byCat[ks[0]]:1;
2204
+ return '<div class="lg-month"><span class="lg-nav" data-act="lg-m" data-d="-1">◀</span>'+
2205
+ '<b class="mono">'+LG.statY+' / '+LG.pad(LG.statM+1)+'</b>'+
2206
+ '<span class="lg-nav" data-act="lg-m" data-d="1">▶</span></div>'+
2207
+ '<div class="lg-panel">'+
2208
+ '<div class="lg-big mono"><s>本月结余</s><b class="'+(s.i-s.o<0?'o':'i')+'">'+(s.i-s.o<0?'-':'')+'¥'+LG.money(Math.abs(s.i-s.o))+'</b></div>'+
2209
+ '<div class="lg-3 mono"><div><s>支出</s><b class="o">¥'+LG.money(s.o)+'</b></div>'+
2210
+ '<div><s>收入</s><b class="i">¥'+LG.money(s.i)+'</b></div>'+
2211
+ '<div><s>笔数</s><b>'+arr.length+'</b></div></div>'+
2212
+ '<div class="lg-lbl">支出分类 BREAKDOWN</div>'+
2213
+ (ks.length?ks.map(function(k){
2214
+ return '<div class="lg-crow"><span class="lg-crow-n">'+LG.emo('out',k)+' '+k+'</span>'+
2215
+ '<span class="lg-bar"><i style="width:'+Math.round(byCat[k]/max*100)+'%"></i></span>'+
2216
+ '<span class="mono">¥'+LG.money(byCat[k])+'</span></div>'}).join('')
2217
+ :'<div class="lg-empty">本月没有支出</div>')+
2218
+ '</div>'+
2219
+ '<div class="lg-foot mono">数据与「小账本」共用同一份存储</div>';
2220
+ };
2221
+ LG.wd=function(ds){var d=new Date(ds+'T00:00:00');if(isNaN(d.getTime()))return '';
2222
+ return ['周日','周一','周二','周三','周四','周五','周六'][d.getDay()]};
2223
+
2224
+ /* ---------- 操作 ---------- */
2225
+ LG.add=function(){
2226
+ var el=$('#lgAmt'),v=el?parseFloat(el.value):NaN;
2227
+ if(!(v>0)){toast('请输入金额');return}
2228
+ if(!LG.cat)LG.cat=(LG.CATS[LG.type]||[['其他']])[0][0];
2229
+ var nt=$('#lgNote'),dt=$('#lgDate');
2230
+ LG.recs.push({
2231
+ id:Date.now()+''+Math.floor(Math.random()*1000),
2232
+ type:LG.type,amount:Math.round(v*100)/100,cat:LG.cat,
2233
+ note:nt?nt.value.trim():'',date:(dt&&dt.value)?dt.value:LG.today(),ts:Date.now()
2234
+ });
2235
+ LG.save();
2236
+ var now=new Date();LG.listY=now.getFullYear();LG.listM=now.getMonth();
2237
+ sfx.ok();toast('已记录 ✓ ¥'+LG.money(v));
2238
+ LG.paint();
2239
+ };
2240
+ LG.del=function(id){
2241
+ var i=-1;LG.recs.forEach(function(r,k){if(r.id===id)i=k});
2242
+ if(i<0)return;
2243
+ var r=LG.recs[i];
2244
+ ask('删除这笔记录?','「'+(r.cat||'')+' ¥'+LG.money(r.amount)+'」会移入回收站(可在小账本里恢复)。',function(){
2245
+ LG.recs.splice(i,1);LG.trash.push(r);LG.save();LG.saveT();
2246
+ toast('已移入回收站');LG.paint();
2247
+ },'删除',true);
2248
+ };
2249
+ V.ledger=function(){LG.load();LG.paint()};
2250
+ /* ================= 战绩数据(WHALE_STATS)=================
2251
+ 本块由 /var/minis/shared/whale/sync_record_stats.py 从 战绩簿 自动生成。
2252
+ 更新流程:改 shared/whale/战绩.md → 跑 sync_record_stats.py → 本块自动重写 */
2253
+ /*WHALE_STATS:BEGIN —— 由 sync_record_stats.py 自动生成于 2026-09-27 01:19;改数据请改 战绩.md 后重跑本脚本 */
2254
+ var WHALE_STATS={"updated":"2026-09-27","stats":[["报备次数","5"],["累计抽数","22,113"],["累计六星","663"],["综合出率","2.998%"],["违约","0 次"],["单发最欧","1 抽"]],"reports":[{"d":"2026-09-26","pool":"池子未确认(主人「好像半周年」)","n":"10,000","six":"288","rate":"2.88%","gap":"34.7 抽","note":"✅ 数据有效——6★ 基础率与池子无关;理论 2.889% / 34.61 抽,偏差仅 −0.009pp ✅ 后来由数字反推:2.88% 更贴近非联动池(2.889%)而非联动池(3.00%)→ 主人的直觉正确"},{"d":"2026-09-26","pool":"彩虹六号联动(井 5/120)","n":"10,000","six":"321","rate":"3.21%","gap":"31.1 抽","note":"联动池理论 ~3.02%(含 120 硬保底),+1.1σ ✓ 正常;最欧 1 抽(一发入魂);5★ 767 个 = 7.67%(理论 8%,−3.7σ ⚠️ 偏门样本或抄录误差;20 万抽对照实测 7.985%,系统无问题)"},{"d":"2026-09-26","pool":"标准寻访(模拟器一键报备)","n":"13","six":"1","rate":"7.69%","gap":"13.0 抽","note":"🍀 唯一一彩恰落第 13 抽(未触软保底,纯运气);期望 0.26~0.38 个 → +1~1.5σ 小欧;5★×2(期望 1.04)"},{"d":"2026-09-26","pool":"P3R 联动(井 15/120)","n":"600","six":"16","rate":"2.67%","gap":"36.6 抽","note":"联动池理论 ~3.02%(含 120 硬保底);期望 18.12 个 → −0.51σ 正常波动(略非);5★ 45 个 = 7.50%(理论 8%,−0.45σ);最非 66 抽(未触软保底)· 最欧 4 抽;注:16 个六星里若有 UP 需主人补报是哪位干员"},{"d":"2026-09-27","pool":"标准寻访(模拟器)","n":"1,500","six":"37","rate":"2.47%","gap":"39.1 抽","note":"标准池理论 ~2.89%(2% 基础+软保底),期望 43.3 个 → −0.97σ 正常偏非;5★ 127 个 = 8.47%(理论 8%,+0.67σ ✓);最非 70 抽(刷新最非记录,前值 66,仍未触 99 硬保底)· 最欧 2 抽(单发总记录仍是 1 抽)"},{"d":"2026-09-26","pool":"彩虹六号联动(1 亿抽大样本)","n":"100,000,000","six":"3,036,676","rate":"3.03668%","gap":"—","note":"五批 × 2000 万,共约 76 秒。保底触发 248,381 次(0.248%)。概率再分配账目精确守恒:6★ 多出 +1.03668pp = 5★ −0.0193pp + 4★ −0.13008pp + 3★ −0.8873pp"}],"mine":[{"d":"2026-09-26","pool":"Ave Mujica 联动","n":"120","got":"丰川祥子(6★)","note":"踩中 120 硬保底最后一抽"},{"d":"2026-09-26","pool":"中坚寻访","n":"550","got":"斯卡蒂(6★)","note":"无 UP 无井,纯抽;期望 1660"},{"d":"2026-09-26","pool":"周年限定","n":"70","got":"可露希尔 + 凯尔希·思衡托","note":"70 抽两个六星,全 UP 组"}]};
2255
+ /*WHALE_STATS:END*/
2256
+
2257
+ /* ================= VIEW: RECORDS(战绩)================= */
2258
+ V.records=function(){
2259
+ var W=(typeof WHALE_STATS!=='undefined'&&WHALE_STATS&&WHALE_STATS.stats)?WHALE_STATS:null;
2260
+ if(!W){
2261
+ $('#vbody').innerHTML='<div class="box" style="padding:14px"><div style="font-size:.82em;opacity:.7;line-height:1.7">战绩数据块还没灌进来 🐋<br>让鲸鲸跑一下 <span class="mono">whale/sync_record_stats.py</span> 就好。</div></div>';
2262
+ return;
2263
+ }
2264
+ var h='';
2265
+ h+='<div style="display:flex;gap:10px;align-items:center;flex-wrap:wrap">'+
2266
+ '<span class="tag cy">战绩簿 / RECORDS</span>'+
2267
+ '<span class="tag">更新于 '+W.updated+'</span>'+
2268
+ '<span class="mono" style="margin-left:auto;font-size:.66em;opacity:.6">🐋 数据由鲸鲸维护</span></div>';
2269
+ h+='<div class="fline" style="margin:10px 0 12px"></div>';
2270
+ h+='<div class="grid" style="grid-template-columns:repeat(3,1fr);gap:8px">';
2271
+ var _c=['#4cc9ff','#4cc9ff','#ff2f52','#ffd23f','#4cc9ff','#ffd23f'];
2272
+ (W.stats||[]).forEach(function(s,i){
2273
+ h+='<div class="box" style="padding:9px 10px;border-left:4px solid '+(_c[i]||'#4cc9ff')+'">'+
2274
+ '<div style="font-size:.62em;opacity:.6;letter-spacing:.12em;white-space:nowrap">'+s[0]+'</div>'+
2275
+ '<div class="disp blue-grad" style="font-size:1.2em;margin-top:3px;white-space:nowrap">'+s[1]+'</div></div>';
2276
+ });
2277
+ h+='</div>';
2278
+ h+='<div class="mono" style="margin:18px 0 8px;font-size:.68em;letter-spacing:.2em;opacity:.75"># 主人报备 / MASTER REPORTS</div>';
2279
+ (W.reports||[]).forEach(function(r){
2280
+ var big=(String(r.n).replace(/,/g,'')*1>100000);
2281
+ h+='<div class="row" style="border-left-color:#ff2f52;align-items:flex-start">'+
2282
+ '<div style="flex:1;min-width:0">'+
2283
+ '<div class="nm">'+r.pool+(big?' <span class="tag" style="transform:scale(.88)">大样本</span>':'')+' <span class="tag" style="transform:scale(.88)">'+r.d+'</span></div>'+
2284
+ '<div class="mono" style="margin-top:5px;font-size:.7em;color:#9fd8ff">'+r.n+' 抽 · '+r.six+' 彩 · 出率 '+r.rate+' · 平均间隔 '+r.gap+'</div>'+
2285
+ (r.note?'<div style="margin-top:5px;font-size:.7em;opacity:.55;line-height:1.55">'+r.note+'</div>':'')+
2286
+ '</div>'+
2287
+ '<div class="rt mono" style="color:#ffd23f;white-space:nowrap">'+r.rate+'</div>'+
2288
+ '</div>';
2289
+ });
2290
+ h+='<div class="mono" style="margin:18px 0 8px;font-size:.68em;letter-spacing:.2em;opacity:.75"># 🐋 鲸鲸自己的记录 / WHALE OPS</div>';
2291
+ (W.mine||[]).forEach(function(r){
2292
+ h+='<div class="row" style="border-left-color:#4cc9ff;align-items:flex-start">'+
2293
+ '<div style="flex:1;min-width:0">'+
2294
+ '<div class="nm">'+r.pool+' <span class="tag" style="transform:scale(.88)">'+r.d+'</span></div>'+
2295
+ '<div class="mono" style="margin-top:5px;font-size:.7em;color:#9fd8ff">'+r.n+' 抽 · 出货:'+r.got+'</div>'+
2296
+ (r.note?'<div style="margin-top:5px;font-size:.7em;opacity:.55;line-height:1.55">'+r.note+'</div>':'')+
2297
+ '</div></div>';
2298
+ });
2299
+ h+='<div class="box" style="margin-top:16px;padding:11px 13px">'+
2300
+ '<div style="font-size:.72em;opacity:.72;line-height:1.65">◆ 抽完卡,到寻访模拟器按「战绩一键报备」,鲸鲸收到自动入账<br>◆ 数据源:🐋 鲸鱼宝库 · 战绩簿</div></div>';
2301
+ $('#vbody').innerHTML=h;
2302
+ };
2303
+ V.archive=function(){
2304
+ var h='<div style="display:flex;gap:14px;flex-wrap:wrap">'+
2305
+ '<div style="flex:1;min-width:min(100%,300px)">'+
2306
+ '<span class="tag cy">档案 / ARCHIVE</span><div class="fline"></div>'+
2307
+ '<div class="row" data-act="taro" style="cursor:pointer;border-left-color:#ffd469">'+
2308
+ '<div><div class="nm">塔罗牌阵 · 过去 / 现在 / 未来</div><div class="sub">TAROT READING · 点击开始占卜</div></div>'+
2309
+ '<div class="rt flashy">✦</div></div>'+
2310
+ [['特别篇 · 月行水上','SideStory · 水上列车事件记录','2026/09/25 03:59 截止'],
2311
+ ['人格面具图鉴','PERSONA COMPENDIUM · 已收录 67 / 214',''],
2312
+ ['角色档案 · 結城 理','MAIN CHARACTER FILE',''],
2313
+ ['角色档案 · アイギス','ANTI-SHADOW WEAPON FILE','']].map(function(x){
2314
+ return '<div class="row" style="cursor:pointer"><div><div class="nm">'+x[0]+'</div><div class="sub">'+x[1]+'</div></div>'+
2315
+ '<div class="rt" style="opacity:.7">'+(x[2]||'›')+'</div></div>'}).join('')+
2316
+ '<div style="margin-top:12px"><button class="btn" data-act="taro">开始塔罗占卜 / TAROT</button></div>'+
2317
+ '</div>'+
2318
+ '<div style="flex:.85;min-width:min(100%,240px);border:2px solid rgba(255,255,255,.7);border-radius:4px;overflow:hidden;position:relative;min-height:220px;background:linear-gradient(160deg,#0a3f8f,#06184a)">'+
2319
+ '<img src="assets/taro.jpg" style="width:100%;height:100%;object-fit:cover;opacity:.95">'+
2320
+ '<div style="position:absolute;left:0;right:0;bottom:0;padding:8px;background:linear-gradient(0deg,rgba(2,8,24,.95),transparent)">'+
2321
+ '<div class="tag">THE FLOW · 时间之势</div></div>'+
2322
+ '</div></div>';
2323
+ $('#vbody').innerHTML=h;
2324
+ };
2325
+
2326
+ /* ================= TAROT MODAL ================= */
2327
+ var TDECK=[
2328
+ ['THE FOOL','愚者 · 0','新的起点,纵身一跃的勇气。','鲁莽或退缩,先看清脚下再跳。'],
2329
+ ['THE MAGICIAN','魔术师 · I','资源齐备,意志成形,放手去做。','空转的才华,先收心再动手。'],
2330
+ ['THE HIGH PRIESTESS','女祭司 · II','静观其变,答案在话语之外。','忽略直觉,信息被藏了起来。'],
2331
+ ['THE EMPRESS','皇后 · III','丰盛与滋养,创造力正在成熟。','过度付出,先把自己照顾好。'],
2332
+ ['THE EMPEROR','皇帝 · IV','秩序与掌控,立规矩的时候。','僵化的控制,松一松手。'],
2333
+ ['THE HIEROPHANT','教皇 · V','传统与引路者,按章法来。','打破成规,或谁都不信。'],
2334
+ ['THE LOVERS','恋人 · VI','心之所向,做出忠于自己的选择。','摇摆不定,回避真正的取舍。'],
2335
+ ['THE CHARIOT','战车 · VII','一鼓作气,方向已定就冲。','失控与内耗,先稳住缰绳。'],
2336
+ ['STRENGTH','力量 · VIII','温柔而坚定,驯服心中的野兽。','自我怀疑,或用劲过猛。'],
2337
+ ['THE HERMIT','隐者 · IX','向内求索,独处就是答案。','关自己太久,出来透透气。'],
2338
+ ['WHEEL OF FORTUNE','命运之轮 · X','转机已至,顺势而为。','逆风期,先别硬闯。'],
2339
+ ['JUSTICE','正义 · XI','因果清算,实事求是。','偏颇与拖延,把话说明白。'],
2340
+ ['THE HANGED ONE','倒吊人 · XII','换一个视角,等待也是行动。','无谓的牺牲,别耗着了。'],
2341
+ ['DEATH','死神 · XIII','旧章落幕,为新生让路。','抗拒结束,拖得太久了。'],
2342
+ ['TEMPERANCE','节制 · XIV','调和与耐心,火候刚刚好。','失衡与过量,先刹车。'],
2343
+ ['THE DEVIL','恶魔 · XV','看清诱惑与束缚,代价要算。','挣脱锁链,把瘾断掉。'],
2344
+ ['THE TOWER','塔 · XVI','突如其来的拆解,越痛越清醒。','可以避免的崩塌,别硬撑。'],
2345
+ ['THE STAR','星 · XVII','希望与指引,夜行水上仍有星光。','信心低迷,慢一点没关系。'],
2346
+ ['THE MOON','月 · XVIII','迷雾与幻象,别急着下结论。','雾散,真相慢慢浮现。'],
2347
+ ['THE SUN','太阳 · XIX','光明与简单的好,尽情开心。','乌云短暂遮日,等一等。'],
2348
+ ['JUDGEMENT','审判 · XX','召唤与觉醒,做下决定吧。','拖延抉择,代价会变大。'],
2349
+ ['THE WORLD','世界 · XXI','圆满达成,一程走完。','差最后一里,别松劲。'],
2350
+ ['ACE OF WANDS','权杖首牌','灵感之火点燃,新的冲动。','火苗熄灭,等下一把柴。'],
2351
+ ['TWO OF WANDS','权杖二','站在高处看远方,先规划。','眼高手低,先落地。'],
2352
+ ['THREE OF WANDS','权杖三','船已出海,等待回音。','计划受阻,收回期待。'],
2353
+ ['FOUR OF WANDS','权杖四','阶段性的庆祝,安稳一下。','根基不稳,别忙着庆祝。'],
2354
+ ['FIVE OF WANDS','权杖五','小小的竞争与摩擦。','内耗结束,偃旗息鼓。'],
2355
+ ['SIX OF WANDS','权杖六','被看见的胜利,接受掌声。','虚荣的嘉奖,不领也罢。'],
2356
+ ['SEVEN OF WANDS','权杖七','守住阵地,一夫当关。','疲于应战,换个打法。'],
2357
+ ['EIGHT OF WANDS','权杖八','消息飞驰,进展加速。','延误与堵塞,催不动就等。'],
2358
+ ['NINE OF WANDS','权杖九','带伤坚守,就差一步。','戒备过头,放下点防备。'],
2359
+ ['TEN OF WANDS','权杖十','重担在肩,扛也要扛完。','该放手的担子,卸下来。'],
2360
+ ['PAGE OF WANDS','权杖侍从','好奇的火种,去试试看。','三分钟热度,先想清楚。'],
2361
+ ['KNIGHT OF WANDS','权杖骑士','行动力拉满,说走就走。','莽撞冲动,收着点劲。'],
2362
+ ['QUEEN OF WANDS','权杖王后','自信与魅力,从容掌控。','急躁与控制欲上头。'],
2363
+ ['KING OF WANDS','权杖国王','远见与统率,一句话定局。','独断专行,听听别人的。'],
2364
+ ['ACE OF CUPS','圣杯首牌','新的心意涌动,爱要溢出。','情绪堵住,先给自己倒一杯。'],
2365
+ ['TWO OF CUPS','圣杯二','两情相悦,彼此看见。','不对等的关系,说开它。'],
2366
+ ['THREE OF CUPS','圣杯三','举杯同庆,友谊与欢聚。','社交过载,独处充电。'],
2367
+ ['FOUR OF CUPS','圣杯四','倦怠期,别错过递来的杯子。','重新振作,机会在门外。'],
2368
+ ['FIVE OF CUPS','圣杯五','失落与遗憾,别只盯洒出的。','走出阴影,看看还剩下的。'],
2369
+ ['SIX OF CUPS','圣杯六','旧日的温柔,故人来信。','沉溺过去,向前看。'],
2370
+ ['SEVEN OF CUPS','圣杯七','选择太多,心要定。','拨云见日,答案清晰了。'],
2371
+ ['EIGHT OF CUPS','圣杯八','转身离开,去更远的地方。','犹豫回望,收拾好再走。'],
2372
+ ['NINE OF CUPS','圣杯九','心愿达成,杯满自饮。','表面满足,心里空一块。'],
2373
+ ['TEN OF CUPS','圣杯十','圆满的归宿,整整齐齐。','关系裂痕,修补要两个人。'],
2374
+ ['PAGE OF CUPS','圣杯侍从','心里冒出的新芽,像一封情书。','情绪化的小题大做。'],
2375
+ ['KNIGHT OF CUPS','圣杯骑士','带着心意而来,浪漫邀约。','空头支票,别急着信。'],
2376
+ ['QUEEN OF CUPS','圣杯王后','温柔而通透,共情的容器。','情绪淹没,先立边界。'],
2377
+ ['KING OF CUPS','圣杯国王','情绪的掌舵者,稳。','压抑或操控情绪。'],
2378
+ ['ACE OF SWORDS','宝剑首牌','一刀劈开的真相,思路通了。','越想越乱,先停一停。'],
2379
+ ['TWO OF SWORDS','宝剑二','僵持的天平,闭眼不看。','僵局松动,该睁眼了。'],
2380
+ ['THREE OF SWORDS','宝剑三','扎心的真相,痛但有用。','伤口在愈合,别二次伤害。'],
2381
+ ['FOUR OF SWORDS','宝剑四','休战与恢复,睡一觉。','强行开机,效率反而差。'],
2382
+ ['FIVE OF SWORDS','宝剑五','赢了争执,输了关系。','和解的信号,见好就收。'],
2383
+ ['SIX OF SWORDS','宝剑六','离开风浪,驶向平静。','带着旧行李上路,找时机放下。'],
2384
+ ['SEVEN OF SWORDS','宝剑七','策略与迂回,有时需要变通。','直面它,别再绕。'],
2385
+ ['EIGHT OF SWORDS','宝剑八','被自己困住,其实门没锁。','解开束缚,第一步最重。'],
2386
+ ['NINE OF SWORDS','宝剑九','深夜的焦虑,天快亮了。','噩梦将醒,接受帮助。'],
2387
+ ['TEN OF SWORDS','宝剑十','谷底,到此为止,不会更差。','缓慢回暖,别回头。'],
2388
+ ['PAGE OF SWORDS','宝剑侍从','敏锐的好奇,保持提问。','道听途说,先核实。'],
2389
+ ['KNIGHT OF SWORDS','宝剑骑士','疾风般的行动,直取目标。','横冲直撞,先看路。'],
2390
+ ['QUEEN OF SWORDS','宝剑王后','清醒与边界感,就事论事。','刻薄或冷漠,心要软一点。'],
2391
+ ['KING OF SWORDS','宝剑国王','理性的权威,规则即公平。','严苛偏执,留点余地。'],
2392
+ ['ACE OF PENTACLES','星币首牌','新的资源落地,种子入土。','机会落空,再等等。'],
2393
+ ['TWO OF PENTACLES','星币二','平衡杂耍,张弛有度。','顾此失彼,先扔掉一个球。'],
2394
+ ['THREE OF PENTACLES','星币三','协作与打磨,手艺被看见。','配合失调,各干各的。'],
2395
+ ['FOUR OF PENTACLES','星币四','守住存量,紧握不放。','安全感松动,试着放手。'],
2396
+ ['FIVE OF PENTACLES','星币五','寒风中赶路,别放弃檐下的光。','雪停了,有人递来热汤。'],
2397
+ ['SIX OF PENTACLES','星币六','给予与接受,施比受有福。','有条件的给予,算清楚。'],
2398
+ ['SEVEN OF PENTACLES','星币七','耕耘期,再等一季。','投入无果,及时调整。'],
2399
+ ['EIGHT OF PENTACLES','星币八','精进技艺,一凿一凿地练。','敷衍重复,找回初心。'],
2400
+ ['NINE OF PENTACLES','星币九','自给自足的丰盛,享受成果。','靠不住的外壳,先修内里。'],
2401
+ ['TEN OF PENTACLES','星币十','家业与传承,长久的安稳。','别短线,看长远。'],
2402
+ ['PAGE OF PENTACLES','星币侍从','踏实的萌芽,开始学习吧。','拖延与空想,从小处做。'],
2403
+ ['KNIGHT OF PENTACLES','星币骑士','稳步推进,可靠最重要。','原地打转,太保守了。'],
2404
+ ['QUEEN OF PENTACLES','星币王后','务实的滋养,把日子过好。','忽视自己,先留一口给自己。'],
2405
+ ['KING OF PENTACLES','星币国王','商业的王者,富足与掌控。','守财或贪婪,散一点财。']
2406
+ ];
2407
+ function tgrad(k){
2408
+ if(k<22)return 'linear-gradient(160deg,#ffd469,#8a5200 62%,#3a2200)';
2409
+ if(k<36)return 'linear-gradient(160deg,#ff9a6a,#a02818 62%,#380800)';
2410
+ if(k<50)return 'linear-gradient(160deg,#7fe9ff,#0a63c8 62%,#041c4f)';
2411
+ if(k<64)return 'linear-gradient(160deg,#d9e6f2,#5c6f8a 62%,#141c2a)';
2412
+ return 'linear-gradient(160deg,#9ef2a0,#1f7a3a 62%,#062e0f)';
2413
+ }
2414
+ function tshuffle(a){for(var i=a.length-1;i>0;i--){var j=Math.floor(Math.random()*(i+1)),t=a[i];a[i]=a[j];a[j]=t}return a}
2415
+ var TARO_NOW=[];
2416
+ function openTaro(){
2417
+ var pool=[];for(var q=0;q<78;q++)pool.push(q);
2418
+ tshuffle(pool);TARO_NOW=pool.slice(0,3).map(function(k){return {k:k,rev:Math.random()<0.5}});
2419
+ var POS=['过去 / PAST','现在 / PRESENT','未来 / FUTURE'];
2420
+ var html='<div class="grid" style="grid-template-columns:repeat(3,1fr);gap:9px" id="tarogrid">'+
2421
+ TARO_NOW.map(function(t,i){
2422
+ var c=TDECK[t.k];
2423
+ var g='background:'+tgrad(t.k)+';filter:hue-rotate('+(((t.k*47)%21)-10)+'deg)';
2424
+ return '<div class="tcard" data-act="flip" data-i="'+i+'">'+
2425
+ '<div class="tfl" id="tc'+i+'">'+
2426
+ '<div class="tfa" style="background:linear-gradient(160deg,#0d2f70,#030c24);border:2px solid rgba(160,215,255,.6)">'+
2427
+ '<div style="text-align:center"><div style="font-size:1.7em;color:#4fb6ff">✦</div>'+
2428
+ '<div style="font-size:.62em;letter-spacing:.2em;opacity:.6;margin-top:4px">TAROT</div></div></div>'+
2429
+ '<div class="tfb" style="'+g+'"><div class="tfin'+(t.rev?' rev':'')+'">'+
2430
+ '<img class="timg" alt="" src="assets/taro78/k'+('0'+t.k).slice(-2)+'.jpg">'+
2431
+ '<div style="text-align:center;padding:7px;position:relative">'+
2432
+ '<div class="disp" style="font-size:clamp(10px,1.4vw,15px);line-height:1.15;color:#04122e;margin-top:3px">'+c[0]+'</div>'+
2433
+ '<div style="font-size:.66em;color:rgba(4,18,46,.85);margin-top:4px;font-weight:700">'+c[1]+'</div>'+
2434
+ (t.rev?'<div style="margin-top:5px;font-size:.58em;letter-spacing:.12em;color:#7c0d1f;font-weight:900">逆位 · REVERSED</div>':'')+
2435
+ '<div class="trib">'+c[1]+(t.rev?' · 逆位':'')+'</div>'+
2436
+ '</div>'+
2437
+ '</div></div>'+
2438
+ '</div>'+
2439
+ '<div class="tag cy" style="position:absolute;left:0;bottom:-26px">'+POS[i]+'</div>'+
2440
+ '</div>';
2441
+ }).join('')+'</div>'+
2442
+ '<div style="display:flex;gap:10px;margin-top:46px;align-items:center;flex-wrap:wrap">'+
2443
+ '<button class="btn" data-act="taro">↻ 重新洗牌抽牌</button>'+
2444
+ '<span style="font-size:.72em;opacity:.55">全 78 张 · 含正逆位</span>'+
2445
+ '</div>'+
2446
+ '<div id="taromsg" style="margin-top:12px;font-size:.85em;line-height:1.65;opacity:.75">点击卡牌翻开 · 三张全部翻开后查看解读</div>';
2447
+ openSheet('TAROT READING · 塔罗牌阵',html);
2448
+ document.querySelectorAll('#tarogrid .timg').forEach(function(im){im.addEventListener('error',function(){im.style.display='none'})});
2449
+ }
2450
+ function flipTaro(i){
2451
+ var el=$('#tc'+i);if(!el||el.getAttribute('data-f')==='1')return;
2452
+ el.setAttribute('data-f','1');sfx.ok();
2453
+ tween(500,function(p){el.style.transform='rotateY('+(180*p).toFixed(1)+'deg)'},function(){
2454
+ var done=0;TARO_NOW.forEach(function(_,k){var e=$('#tc'+k);if(e&&e.getAttribute('data-f')==='1')done++});
2455
+ var m=$('#taromsg');
2456
+ if(done<3){if(m)m.innerHTML='命运正在揭示 · 已翻开 '+done+' / 3';sfx.tap();return}
2457
+ sfx.chime();
2458
+ if(m)m.innerHTML=TARO_NOW.map(function(t,i){
2459
+ var c=TDECK[t.k],pos=['过去','现在','未来'][i];
2460
+ return '<div style="margin-bottom:9px"><b style="color:#8fe0ff">['+pos+'] '+c[1]+'</b> '+
2461
+ '<span style="font-size:.8em;opacity:.65">'+c[0]+'</span> '+
2462
+ '<b style="color:'+(t.rev?'#ff9db0':'#9fe9a0')+'">· '+(t.rev?'逆位':'正位')+'</b><br>'+(t.rev?c[3]:c[2])+'</div>'}).join('');
2463
+ });
2464
+ }
2465
+
2466
+ /* ================= SHEET PANELS ================= */
2467
+ function openDepot(){
2468
+ openSheet('DEPOT · 仓库',
2469
+ '<div class="grid" style="grid-template-columns:repeat(auto-fill,minmax(92px,1fr))">'+
2470
+ [['龙门币',fmt(S.res.or),'◈','linear-gradient(140deg,#7fe9ff,#0a63c8)'],
2471
+ ['合成玉',fmt(S.res.rd),'✦','linear-gradient(140deg,#ff5a72,#8c0018)'],
2472
+ ['源石',fmt(S.res.gd),'✵','linear-gradient(140deg,#ffd469,#8a5200)'],
2473
+ ['聚合剂','12','⬢','linear-gradient(140deg,#a06cff,#3a1080)'],
2474
+ ['异铁组','48','⬟','linear-gradient(140deg,#59e0c8,#046a58)'],
2475
+ ['加急许可','3','◎','linear-gradient(140deg,#ffffff,#7fa8d8)']].map(function(x){
2476
+ return '<div class="box" style="padding:7px;text-align:center">'+
2477
+ '<div style="height:44px;border-radius:3px;background:'+x[3]+';display:grid;place-items:center;font-size:22px;color:rgba(0,20,50,.7)">'+x[2]+'</div>'+
2478
+ '<div style="font-size:.72em;margin-top:5px;opacity:.8">'+x[0]+'</div><b>'+x[1]+'</b></div>'}).join('')+'</div>');
2479
+ }
2480
+ function applyCrt(){var a=$('#app');if(a)a.classList.toggle('nocrt',!S.crt)}
2481
+ function openSettings(){
2482
+ openSheet('SYSTEM · 设置',
2483
+ '<div class="row" data-act="toggle" data-k="snd"><div><div class="nm">音效</div><div class="sub">WebAudio 合成音</div></div>'+
2484
+ '<div class="rt"><span class="chip'+(S.snd?' on':'')+'" id="tg-snd">'+(S.snd?'ON':'OFF')+'</span></div></div>'+
2485
+ '<div class="row" data-act="toggle" data-k="fx"><div><div class="nm">过场动画</div><div class="sub">切换界面时的斜带演出</div></div>'+
2486
+ '<div class="rt"><span class="chip'+(S.fx?' on':'')+'" id="tg-fx">'+(S.fx?'ON':'OFF')+'</span></div></div>'+
2487
+ '<div class="row" data-act="toast" data-msg="数据存在本机 · 无云端同步"><div><div class="nm">存档</div><div class="sub">本地存储 / localStorage</div></div>'+
2488
+ '<div class="rt" style="opacity:.6">›</div></div>'+
2489
+ '<div style="margin-top:12px;font-size:.76em;opacity:.6;line-height:1.6">ARKNIGHTS × PERSONA3 RELOAD 风格 UI · 单文件演示<br>素材取自公开联动视觉参考,仅作风格练习。</div>');
2490
+ }
2491
+ function openNotice(){
2492
+ openSheet('NOTICE · 公告',
2493
+ [['月行水上 活动开启','限定寻访「月行水上」现已开启,六星干员出现率提升。','23:59'],
2494
+ ['维护补偿','09/25 04:00 全服维护,补偿合成玉 ×300。','维护'],
2495
+ ['签到活动','锦枫映月 · 连续签到 7 日可领取限定家具。','3天']].map(function(x){
2496
+ return '<div class="row" style="border-left-color:#ffd469"><div><div class="nm">'+x[0]+'</div><div class="sub">'+x[1]+'</div></div>'+
2497
+ '<div class="rt"><span class="tag rd">'+x[2]+'</span></div></div>'}).join(''));
2498
+ }
2499
+ function openMail(){
2500
+ openSheet('MAILBOX · 邮件',
2501
+ [['维护补偿发放','附件:合成玉 ×300','未读'],['活动奖励结算','附件:寻访凭证 ×1','未读'],
2502
+ ['好友赠送','来自 Amano 的信用点 ×200','已读']].map(function(x,i){
2503
+ return '<div class="row" data-act="mail" data-i="'+i+'" style="cursor:pointer;border-left-color:'+(i<2?'#d7f24a':'#4a6b96')+'">'+
2504
+ '<div><div class="nm">'+x[0]+'</div><div class="sub">'+x[1]+'</div></div><div class="rt"><span class="tag">'+x[2]+'</span></div></div>'}).join(''));
2505
+ }
2506
+ function openCal(){
2507
+ var d=new Date(),y=d.getFullYear(),m=d.getMonth();
2508
+ var first=new Date(y,m,1).getDay(),days=new Date(y,m+1,0).getDate();
2509
+ var cells='';for(var i=0;i<first;i++)cells+='<div></div>';
2510
+ for(var j=1;j<=days;j++){
2511
+ var on=j===d.getDate();
2512
+ cells+='<div style="height:30px;display:grid;place-items:center;border-radius:3px;font-size:.8em;'+
2513
+ (on?'background:#2fa8ff;color:#02122e;font-weight:900':'background:rgba(3,12,34,.6);border:1px solid rgba(120,200,255,.18)')+'">'+j+'</div>';
2514
+ }
2515
+ openSheet('CALENDAR · '+y+'/'+(m+1),
2516
+ '<div style="display:grid;grid-template-columns:repeat(7,1fr);gap:4px;font-size:.72em;opacity:.6;text-align:center">'+
2517
+ ['日','一','二','三','四','五','六'].map(function(x){return '<div>'+x+'</div>'}).join('')+'</div>'+
2518
+ '<div style="display:grid;grid-template-columns:repeat(7,1fr);gap:4px;margin-top:6px">'+cells+'</div>');
2519
+ }
2520
+
2521
+ /* ================= EVENT DELEGATION ================= */
2522
+ function handleUI(u){
2523
+ var k=u.getAttribute('data-ui');
2524
+ if(k==='settings')openSettings();
2525
+ else if(k==='notice')openNotice();
2526
+ else if(k==='mail')openMail();
2527
+ else if(k==='cal')openCal();
2528
+ else if(k==='depot')openDepot();
2529
+ else if(k==='taro')openTaro();
2530
+ }
2531
+ function claimAll(){
2532
+ var n=0;MISS.forEach(function(x){if(x.c>=x.m&&!x.got){x.got=true;n++}});
2533
+ if(!n){sfx.deny();toast('暂无可领取奖励');return}
2534
+ S.res.or+=2100;S.res.rd+=7000;syncRes();sfx.chime();
2535
+ toast('已领取 '+n+' 项奖励 · 龙门币 +2100 / 合成玉 +7000');
2536
+ V.mission();
2537
+ }
2538
+ function handleAct(t){
2539
+ var a=t.getAttribute('data-act');
2540
+ if(a!=='toast'&&a!=='flip')sfx.tap();
2541
+ if(a==='sq'){S.curSquad=+t.getAttribute('data-i');sfx.move();V.squads()}
2542
+ else if(a==='slot'||a==='clear'){var i=+t.getAttribute('data-i');
2543
+ if(a==='clear'){S.squads[S.curSquad][i]=null;closeSheet();sfx.back();V.squads()}
2544
+ else pickOpFor(i);}
2545
+ else if(a==='pick'){var pi=+t.getAttribute('data-i'),oid=t.getAttribute('data-op');
2546
+ S.squads[S.curSquad][pi]=oid;closeSheet();sfx.ok();toast('已编入 · '+OP(oid).cn);V.squads()}
2547
+ else if(a==='autofill'){S.squads[S.curSquad]=['makoto','aigis','mitsuru','akihiko','yukari','fuuka'];
2548
+ sfx.chime();toast('已按战力自动编成');V.squads()}
2549
+ else if(a==='optab'){opTab=t.getAttribute('data-t');sfx.move();V.operator()}
2550
+ else if(a==='opick'){opSel=+t.getAttribute('data-i');sfx.move();V.operator()}
2551
+ else if(a==='opick2'){var id=t.getAttribute('data-id');for(var k=0;k<OPS.length;k++)if(OPS[k].id===id)opSel=k;
2552
+ opTab='card';sfx.ok();V.operator()}
2553
+ else if(a==='setsup'){sfx.chime();toast('已设为助战干员 · '+OP(t.getAttribute('data-op')).cn)}
2554
+ else if(a==='toast'){sfx.ok();toast(t.getAttribute('data-msg'))}
2555
+ else if(a==='buy'){buy(t.getAttribute('data-id'))}
2556
+ else if(a==='ropt'){var rk=t.getAttribute('data-k');RPICK[rk]=(RPICK[rk]+1)%ROPTS[rk].length;sfx.move();V.recruit()}
2557
+ else if(a==='recstart'){recStart()}
2558
+ else if(a==='recreset'){RPICK={cls:0,pos:0,qual:0,feat:0,time:3};sfx.back();V.recruit()}
2559
+ else if(a==='pull'){doPull(+t.getAttribute('data-n'))}
2560
+ else if(a==='claim'){var mi=+t.getAttribute('data-i');
2561
+ if(MISS[mi].c>=MISS[mi].m&&!MISS[mi].got){MISS[mi].got=true;S.res.or+=500;S.res.rd+=300;syncRes();
2562
+ sfx.chime();toast('已领取 · '+MISS[mi].rw);V.mission()}}
2563
+ else if(a==='claimall'){claimAll()}
2564
+ else if(a==='tq'){TS.load();var qid=t.getAttribute('data-id'),q=null;TQ.forEach(function(x){if(x.id===qid)q=x});
2565
+ if(q){if(!TS.d.done[qid]){TS.d.done[qid]=1;TS.save();sfx.ok();toast('已打卡 · '+q.n);V.mission()}
2566
+ else if(!TS.d.got[qid]){TS.d.got[qid]=1;TS.d.fish+=q.rw;TS.d.earn+=q.rw;TS.save();sfx.chime();
2567
+ osc({f1:620,f2:930,dur:.2,vol:.06});nz({f1:2400,f2:900,dur:.17,vol:.06});toast('\ud83d\udc1f +'+q.rw+' · 谢谢主人养鲸鲸');V.mission()}
2568
+ else{sfx.deny();toast('今天的份已经领过啦 · 明天再来')}}}
2569
+ else if(a==='tqall'){TS.load();var n=0,sum=0;TQ.forEach(function(q){if(TS.d.done[q.id]&&!TS.d.got[q.id]){TS.d.got[q.id]=1;n++;sum+=q.rw}});
2570
+ if(n){TS.d.fish+=sum;TS.d.earn+=sum;TS.save();sfx.chime();toast('已领取 '+n+' 份 · \ud83d\udc1f +'+sum)}else{sfx.deny();toast('没有待领的奖励 · 先去打卡吧')}
2571
+ V.mission()}
2572
+ else if(a==='fshop'){TS.load();var fid=t.getAttribute('data-id'),fit=null;TSHOP.forEach(function(x){if(x.id===fid)fit=x});
2573
+ if(fit){var _dm=TD.daily().map,_off=TD.off(fit,_dm),_pp=TD.price(fit,_dm);
2574
+ if(TS.d.fish<_pp){sfx.deny();toast('小鱼干不够 · 还差 '+(_pp-TS.d.fish)+' \ud83d\udc1f')}
2575
+ else{TS.d.fish-=_pp;TS.d.own[fit.id]=(TS.d.own[fit.id]||0)+1;TS.save();sfx.chime();
2576
+ osc({f1:660,f2:990,dur:.2,vol:.06});nz({f1:2600,f2:900,dur:.18,vol:.06});toast('已兑换 · '+fit.n+'(-'+_pp+' \ud83d\udc1f'+(_off?' · 特价 -'+_off+'%':'')+')');V.store()}}}
2577
+ else if(a==='dref'){TS.load();
2578
+ var rfH2=new Date().getHours();
2579
+ if(TS.d.rfDay!==TS.today()){TS.d.rfDay=TS.today();TS.d.rfN=0;TS.save()}
2580
+ if(rfH2<3){sfx.deny();toast('刷新机会 3:00 后才到账 · 先睡会儿吧')}
2581
+ else if(TS.d.rfN>=1){sfx.deny();toast('今日的刷新机会已经用掉啦 · 明天 3:00 再来')}
2582
+ else{TS.d.rfN=1;TS.save();sfx.chime();osc({f1:700,f2:1200,dur:.22,vol:.06});nz({f1:2800,f2:1000,dur:.2,vol:.06});
2583
+ var nd=TD.daily(),lo=99;for(var kk in nd.map){if(nd.map[kk]<lo)lo=nd.map[kk]}
2584
+ toast('已重摇 🎲 今日最低 -'+lo+'% · 快看新价签');V.store()}}
2585
+ else if(a==='go'){sfx.move();openView(t.getAttribute('data-view')||t.getAttribute('data-v'))}
2586
+ else if(a==='gogacha'){portalOpen('gacha.html','寻访模拟器')}
2587
+ else if(a==='gofull'){portalOpen('ledger.html','完整版账本')}
2588
+ else if(a==='stk1'){portalOpen('ledger.html','小账本')}
2589
+ else if(a==='stk2'){portalOpen('gacha.html','寻访模拟器')}
2590
+ else if(a==='room'){var ri=+t.getAttribute('data-i'),r=ROOMS[ri];
2591
+ openSheet('FACILITY · '+r.n,
2592
+ '<div class="row" style="border-left-color:#d7f24a"><div><div class="nm">设施等级</div><div class="sub">'+r.ic+' '+r.n+'</div></div>'+
2593
+ '<div class="rt disp blue-grad" style="font-size:1.5em">LV'+r.lv+'</div></div>'+
2594
+ '<div style="margin-top:10px" class="box"><div class="sub">进驻干员</div>'+
2595
+ (r.op?'<div style="display:flex;align-items:center;gap:9px;margin-top:6px"><div style="width:46px;height:46px;border-radius:3px;overflow:hidden">'+av(OP(r.op))+'</div>'+
2596
+ '<div><b>'+OP(r.op).cn+'</b><div style="font-size:.76em;opacity:.7">'+OP(r.op).cls+' · 效率 +'+(12+r.lv*3)+'%</div></div></div>'
2597
+ :'<div style="margin-top:6px;opacity:.6;font-size:.85em">暂无干员进驻</div>')+
2598
+ '</div><div style="display:flex;gap:8px;margin-top:12px;flex-wrap:wrap">'+
2599
+ '<button class="btn sm" data-act="toast" data-msg="'+r.n+' 已开始加速生产">加速生产</button>'+
2600
+ '<button class="btn gh sm" data-act="toast" data-msg="已调整 '+r.n+' 进驻干员">更换干员</button></div>');
2601
+ }
2602
+ else if(a==='taro'){openTaro()}
2603
+ else if(a==='flip'){flipTaro(+t.getAttribute('data-i'))}
2604
+ else if(a==='toggle'){var tk=t.getAttribute('data-k');S[tk]=!S[tk];sfx.move();
2605
+ var e=$('#tg-'+tk);if(e){e.textContent=S[tk]?'ON':'OFF';e.className='chip'+(S[tk]?' on':'')}
2606
+ if(tk==='crt')applyCrt()}
2607
+ else if(a==='mail'){S.res.rd+=300;syncRes();sfx.chime();toast('已领取邮件附件 · 合成玉 ×300')}
2608
+ else if(a==='lg-tab'){LG.tab=t.getAttribute('data-v');sfx.move();LG.paint()}
2609
+ else if(a==='lg-type'){LG.type=t.getAttribute('data-v');LG.cat=null;sfx.move();LG.paint()}
2610
+ else if(a==='lg-cat'){LG.cat=t.getAttribute('data-v');sfx.move();LG.paint()}
2611
+ else if(a==='lg-save'){LG.add()}
2612
+ else if(a==='lg-del'){LG.del(t.getAttribute('data-v'))}
2613
+ else if(a==='lg-m'){sfx.move();LG.shift(parseInt(t.getAttribute('data-d'),10))}
2614
+ }
2615
+ document.addEventListener('click',function(e){
2616
+ var t=e.target.closest?e.target.closest('[data-act]'):null;
2617
+ if(t){handleAct(t);return}
2618
+ var u=e.target.closest?e.target.closest('[data-ui]'):null;
2619
+ if(u)handleUI(u);
2620
+ },false);
2621
+
2622
+ /* ================= KEYBOARD ================= */
2623
+ document.addEventListener('keydown',function(e){
2624
+ if($('#view').classList.contains('on')){
2625
+ if(e.key==='Escape'||e.key==='Backspace'){e.preventDefault();closeView()}
2626
+ return;
2627
+ }
2628
+ if($('#sheet').classList.contains('on')||$('#mask').classList.contains('on')){
2629
+ if(e.key==='Escape'){closeSheet();$('#mask').classList.remove('on')}
2630
+ return;
2631
+ }
2632
+ if(e.key==='ArrowDown'){e.preventDefault();moveSel(0,1)}
2633
+ else if(e.key==='ArrowUp'){e.preventDefault();moveSel(0,-1)}
2634
+ else if(e.key==='ArrowRight'){e.preventDefault();moveSel(1,0)}
2635
+ else if(e.key==='ArrowLeft'){e.preventDefault();moveSel(-1,0)}
2636
+ else if(e.key==='Enter'||e.key===' '){e.preventDefault();launch(S.sel)}
2637
+ },false);
2638
+
2639
+ /* ================= BOOT ================= */
2640
+ function boot(){
2641
+ var b=$('#boot');b.classList.add('on');
2642
+ b.innerHTML='<div class="bi"><div class="e">MOONLIT WATERS</div>'+
2643
+ '<div class="s">ARKNIGHTS × PERSONA3 RELOAD</div><div class="ln" id="bln"></div></div>';
2644
+ tween(760,function(p){var l=$('#bln');if(l)l.style.transform='scaleX('+p.toFixed(3)+')'});
2645
+ setTimeout(function(){
2646
+ tween(380,function(p){b.style.opacity=(1-p).toFixed(2)},function(){
2647
+ b.classList.remove('on');b.style.opacity='';
2648
+ cine('ARKNIGHTS','罗德岛终端','MOONLIT WATERS','#fff','#7fd0ff',function(){});
2649
+ });
2650
+ },820);
2651
+ }
2652
+ $('#vback').addEventListener('click',function(){closeView()});
2653
+ window.__AK={openView:openView,closeView:closeView,toast:toast,openSheet:openSheet,
2654
+ openTaro:openTaro,openDepot:openDepot,openSettings:openSettings,openNotice:openNotice,
2655
+ closeSheet:closeSheet,openMail:openMail,openCal:openCal,
2656
+ cine:cine,V:V,S:S,OPS:OPS,MENU:MENU};
2657
+ document.addEventListener('pointerdown',function(){ac()},{once:true});
2658
+
2659
+ /* ================= INIT ================= */
2660
+ $('#home').classList.add('on');applyCrt();
2661
+ ['hero','crew','card','boy','fig','face','grn','taro','scene'].forEach(function(n){
2662
+ var i=new Image();i.src='assets/'+n+'.jpg';});
2663
+ mkDeco();buildMenu();syncRes();updTopStats();setInterval(updTopStats,5000);pulse();
2664
+ requestAnimationFrame(loop);
2665
+ boot();
2666
+ })();
2667
+ </script>
2668
+ <script>
2669
+ /* 兜底看门狗:JS 报错 / 被节流 / 脚本没跑起来时,也保证主界面可见(防止只剩黑底) */
2670
+ (function(){
2671
+ function rescue(){
2672
+ var h=document.getElementById('home');
2673
+ if(h&&!h.classList.contains('on'))h.classList.add('on');
2674
+ var b=document.getElementById('boot');
2675
+ if(b){b.classList.remove('on');b.style.display='none'}
2676
+ }
2677
+ window.addEventListener('error',function(){setTimeout(rescue,200)});
2678
+ setTimeout(rescue,5000);
2679
+ setTimeout(function(){var c=document.getElementById('cine');if(c)c.classList.remove('on')},8000);
2680
+ })();
2681
+ </script>
2682
+ <!-- ===== 完整寻访模拟器(页内 iframe 集成) ===== -->
2683
+ <div class="gv" id="gViewer">
2684
+ <div class="gv-top">
2685
+ <span class="gv-title" id="gvTitle">标准寻访模拟 · HEADHUNT 完整版</span>
2686
+ <a href="gacha.html" target="_blank" rel="noopener">独立打开 ↗</a>
2687
+ <button id="gvClose">✕ 返回</button>
2688
+ </div>
2689
+ <iframe class="gv-frame" id="gvFrame" title="寻访模拟器"></iframe>
2690
+ </div>
2691
+ <script>
2692
+ (function () {
2693
+ var v = document.getElementById('gViewer'), f = document.getElementById('gvFrame');
2694
+ function openG() {
2695
+ if (!f.getAttribute('src')) f.setAttribute('src', 'gacha.html');
2696
+ v.classList.add('on');
2697
+ setTimeout(function () {
2698
+ var ok = false;
2699
+ try { ok = !!(f.contentDocument && f.contentDocument.body &&
2700
+ f.contentDocument.body.querySelector('*')); } catch (e) { ok = false; }
2701
+ if (!ok) location.href = 'gacha.html';
2702
+ }, 3500);
2703
+ }
2704
+ function closeG() { v.classList.remove('on'); }
2705
+ document.getElementById('gvClose').addEventListener('click', closeG);
2706
+ document.addEventListener('keydown', function (e) { if (e.key === 'Escape') closeG(); });
2707
+ document.addEventListener('click', function (e) {
2708
+ var a = e.target && e.target.closest ? e.target.closest('a[href="gacha.html"]') : null;
2709
+ if (!a) return;
2710
+ if (a.closest && a.closest('#gViewer')) return; // 覆盖层内的「独立打开」不拦截
2711
+ e.preventDefault(); openG();
2712
+ });
2713
+ })();
2714
+ </script>
2715
+
2716
+ <script>
2717
+ (function(){
2718
+ var B=document.getElementById('petB'),bub=document.getElementById('petBub'),txt=document.getElementById('petTxt');
2719
+ if(!B)return;
2720
+ var L=['哦鲸鲸…','主人~','捏到了!再捏一下嘛','今日宜抽卡','小鱼干 +1!','BUILD v25 已就位','账单同步了吗?','过场动画,好看吧?','晚安前记得说晚安哦','鲸鲸在看家…','要摸摸头吗?','别熬夜啦,主人'];
2721
+ var last=-1,ht=0;
2722
+ function say(){
2723
+ var i;do{i=Math.floor(Math.random()*L.length)}while(i===last);
2724
+ last=i;txt.textContent=L[i];bub.classList.add('on');
2725
+ clearTimeout(ht);ht=setTimeout(function(){bub.classList.remove('on')},7000);
2726
+ }
2727
+ function dn(){B.classList.remove('pop');B.classList.add('sq');try{window.__squeak&&window.__squeak()}catch(e){}}
2728
+ function up(){
2729
+ if(!B.classList.contains('sq'))return;
2730
+ B.classList.remove('sq');B.classList.add('pop');
2731
+ setTimeout(function(){B.classList.remove('pop')},400);
2732
+ say();
2733
+ }
2734
+ var P={t:0,down:0};
2735
+ function ev(e){
2736
+ var n=Date.now();if(P.down||n-P.t<60)return;P.down=1;P.t=n;
2737
+ if(e&&e.cancelable)try{e.preventDefault()}catch(x){}
2738
+ dn();
2739
+ }
2740
+ function eu(){if(!P.down)return;P.down=0;P.t=Date.now();up();}
2741
+ function ec(){P.down=0;P.t=Date.now();B.classList.remove('sq')}
2742
+ B.addEventListener('pointerdown',ev,{passive:false});
2743
+ B.addEventListener('touchstart',ev,{passive:false});
2744
+ B.addEventListener('mousedown',ev);
2745
+ B.addEventListener('pointerup',eu);
2746
+ B.addEventListener('touchend',eu);
2747
+ B.addEventListener('mouseup',eu);
2748
+ B.addEventListener('pointercancel',ec);
2749
+ B.addEventListener('touchcancel',ec);
2750
+ B.addEventListener('contextmenu',function(e){e.preventDefault()});
2751
+ setTimeout(say,1800);
2752
+ setInterval(function(){if(document.visibilityState==='visible')say()},36000);
2753
+ })();
2754
+ </script>
2755
+ <div style="position:fixed;left:10px;bottom:5px;font-size:9px;letter-spacing:.14em;color:#4cc9ff;opacity:.5;z-index:45;font-family:ui-monospace,Menlo,monospace;pointer-events:none">BUILD v25</div>
2756
+ </body>
2757
+ </html>