@yyyu-star/arcade-kit 0.18.1 → 0.19.1
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.
- package/CHANGELOG.md +27 -0
- package/README.md +29 -2
- package/dist/fun-logic.d.ts +81 -0
- package/dist/fun-logic.d.ts.map +1 -1
- package/dist/fun-logic.js +143 -0
- package/dist/fun-logic.js.map +1 -1
- package/dist/table-chat.d.ts +148 -0
- package/dist/table-chat.d.ts.map +1 -0
- package/dist/table-chat.js +560 -0
- package/dist/table-chat.js.map +1 -0
- package/dist/table-fun.d.ts +56 -33
- package/dist/table-fun.d.ts.map +1 -1
- package/dist/table-fun.js +137 -111
- package/dist/table-fun.js.map +1 -1
- package/package.json +1 -1
- package/src/fun-logic.ts +161 -0
- package/src/table-chat.ts +631 -0
- package/src/table-fun.ts +158 -107
|
@@ -0,0 +1,560 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 牌桌聊天的界面(0.19.0,docs/chat.md 第 5 节):电脑上牌桌一角常驻的聊天框、手机上的"聊天"按钮和贴底输入条、弹幕、最近 30 条记录。
|
|
3
|
+
* 所有者 2026-10-18:聊天太简陋、不显眼,电脑上气泡太小。TableFun 建它、喂它,游戏不直接用(不进 package.json 的 exports)。
|
|
4
|
+
* 和 table-fun.ts 同样的规矩:import 时不碰 DOM;动画只动 transform、opacity;量位置只在摆放(refresh)和出一条弹幕时。
|
|
5
|
+
*/
|
|
6
|
+
import { CHAT_MAX, chatRejectText } from './chat.js';
|
|
7
|
+
import { DANMAKU, barBottom, chatFont, chatMode, danmakuLanes, danmakuSpeed, pickLane, placeBeside, placeDock, seatColor } from './fun-logic.js';
|
|
8
|
+
export const CHAT_CSS = `
|
|
9
|
+
.atc-dock{position:absolute;left:0;top:0;pointer-events:auto;display:flex;flex-direction:column;gap:6px;background:var(--ak-bg,rgba(43,29,20,.9));border:2px solid var(--ak-border,#d4a64a);border-radius:var(--ak-radius,14px);padding:8px;box-sizing:border-box;color:var(--ak-fg,#fff6e0);box-shadow:0 6px 18px rgba(0,0,0,.4)}
|
|
10
|
+
.atc-head{display:flex;align-items:center;gap:6px}
|
|
11
|
+
.atc-head b{flex:1;color:var(--ak-title,#f3d98b);font-size:1.05em}
|
|
12
|
+
.atc-head .atf-chip{min-height:36px;padding:0 10px;font-size:.8em}
|
|
13
|
+
.atc-log{display:flex;flex-direction:column;gap:2px;line-height:1.45;font-size:.9em;overflow-y:auto;overscroll-behavior:contain}
|
|
14
|
+
.atc-log .atf-empty{opacity:.6}
|
|
15
|
+
.atc-log b,.atf-log b{font-weight:700;margin-right:4px}
|
|
16
|
+
.atc-quick{display:flex;gap:6px;overflow-x:auto;overscroll-behavior:contain;scrollbar-width:none;flex-shrink:0;padding-right:28px;-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 36px),transparent);mask-image:linear-gradient(to right,#000 calc(100% - 36px),transparent)}
|
|
17
|
+
.atc-quick::-webkit-scrollbar{display:none}
|
|
18
|
+
.atc-quick .atf-chip{flex:none;white-space:nowrap;font-size:.8em}
|
|
19
|
+
.atc-row{display:flex;gap:6px;align-items:center}
|
|
20
|
+
.atc-row .atf-input{font-size:max(16px,.85em)}
|
|
21
|
+
.atc-row .atf-chip{flex:none}
|
|
22
|
+
.atc-pill{position:absolute;left:0;top:0;pointer-events:auto;min-height:44px;display:flex;align-items:center;gap:6px;padding:0 16px;border-radius:var(--ak-radius-btn,22px);border:2px solid var(--ak-border,#d4a64a);background:var(--ak-soft,#5a3a22);color:var(--ak-fg,#fff6e0);font:inherit;font-weight:700;cursor:pointer}
|
|
23
|
+
.atc-pill svg{width:1.2em;height:1.2em}
|
|
24
|
+
.atc-pill.atf-dot::after{content:'';position:absolute;right:4px;top:4px;width:10px;height:10px;border-radius:50%;background:#e8323a;border:2px solid var(--ak-fg,#fff6e0)}
|
|
25
|
+
.atc-dock .atf-note:empty,.atc-bar .atf-note:empty{display:none}
|
|
26
|
+
.atc-bar{position:absolute;left:8px;right:8px;top:0;pointer-events:auto;display:flex;flex-direction:column;gap:6px;background:var(--ak-bg,rgba(43,29,20,.94));border:2px solid var(--ak-border,#d4a64a);border-radius:var(--ak-radius,14px);padding:6px;box-sizing:border-box;color:var(--ak-fg,#fff6e0);box-shadow:0 -4px 16px rgba(0,0,0,.4)}
|
|
27
|
+
.atc-dms{position:absolute;inset:0;z-index:0;pointer-events:none;overflow:hidden}
|
|
28
|
+
.atc-dm{position:absolute;left:0;top:0;white-space:nowrap;font-weight:700;color:#fff;padding:2px 12px;border-radius:999px;background:rgba(0,0,0,.38);text-shadow:0 1px 2px rgba(0,0,0,.8);pointer-events:none;will-change:transform}
|
|
29
|
+
.atc-dm.atc-me{background:rgba(122,42,30,.78);border:2px solid var(--ak-title,#f3d98b);color:#fff6e0}
|
|
30
|
+
`;
|
|
31
|
+
const CHAT_ICON = '<svg viewBox="0 0 64 64" fill="none" stroke="currentColor" stroke-width="5" stroke-linejoin="round"><path d="M10 14h44v28H30l-12 10v-10h-8z"/></svg>';
|
|
32
|
+
/** prefsKey 只认 `<游戏id>.<名字>` 的写法(存储前缀规则:kit 写的 key 一定带游戏前缀),不合格构造时就抛错 */
|
|
33
|
+
export function checkPrefsKey(key, storageKey) {
|
|
34
|
+
if (typeof key !== 'string' || !key.startsWith(`${storageKey}.`) || !/^[a-z0-9][a-z0-9-]*(\.[a-z0-9-]+)+$/.test(key) || key.length > 64) {
|
|
35
|
+
throw new Error(`TableFun prefsKey 要写成 "${storageKey}.<名字>"(小写字母、数字、连字符),收到 ${JSON.stringify(key)}`);
|
|
36
|
+
}
|
|
37
|
+
return key;
|
|
38
|
+
}
|
|
39
|
+
function add(parent, ...kids) {
|
|
40
|
+
for (const k of kids)
|
|
41
|
+
parent.appendChild(k);
|
|
42
|
+
}
|
|
43
|
+
export class ChatUi {
|
|
44
|
+
/** 最近 KEEP 条,新的在后 */
|
|
45
|
+
lines = [];
|
|
46
|
+
static KEEP = 30;
|
|
47
|
+
h;
|
|
48
|
+
doc;
|
|
49
|
+
prefs;
|
|
50
|
+
on = false;
|
|
51
|
+
mode = 'desk';
|
|
52
|
+
font = 18;
|
|
53
|
+
dockEl = null;
|
|
54
|
+
pill = null;
|
|
55
|
+
btn = null;
|
|
56
|
+
bar = null;
|
|
57
|
+
/** 渲染记录的地方:电脑版聊天框里的那块、互动面板聊天页里的那块 */
|
|
58
|
+
logs = new Set();
|
|
59
|
+
unread = false;
|
|
60
|
+
freeAt = [];
|
|
61
|
+
live = 0;
|
|
62
|
+
pending = [];
|
|
63
|
+
waiting = false;
|
|
64
|
+
vvFix = null;
|
|
65
|
+
/** 弹幕自己一层,垫在效果层最底下:气泡、表情、道具永远在弹幕上面 */
|
|
66
|
+
dm = null;
|
|
67
|
+
constructor(host) {
|
|
68
|
+
this.h = host;
|
|
69
|
+
this.doc = host.ui.ownerDocument;
|
|
70
|
+
this.prefs = this.load();
|
|
71
|
+
}
|
|
72
|
+
dmLayer() {
|
|
73
|
+
if (!this.dm) {
|
|
74
|
+
this.dm = this.el('div', 'atc-dms');
|
|
75
|
+
this.h.fx.insertBefore(this.dm, this.h.fx.firstChild);
|
|
76
|
+
}
|
|
77
|
+
return this.dm;
|
|
78
|
+
}
|
|
79
|
+
// ───────────── 设置 ─────────────
|
|
80
|
+
load() {
|
|
81
|
+
try {
|
|
82
|
+
const raw = JSON.parse(localStorage.getItem(this.h.prefsKey) ?? 'null');
|
|
83
|
+
if (!raw || typeof raw !== 'object')
|
|
84
|
+
return {};
|
|
85
|
+
const out = {};
|
|
86
|
+
for (const k of ['danmaku', 'folded', 'long'])
|
|
87
|
+
if (typeof raw[k] === 'boolean')
|
|
88
|
+
out[k] = raw[k];
|
|
89
|
+
return out;
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return {};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
save() {
|
|
96
|
+
try {
|
|
97
|
+
localStorage.setItem(this.h.prefsKey, JSON.stringify(this.prefs));
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// 存不了就只是这一次有效
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/** 弹幕开着吗:设过就按设的;没设过,系统要求减少动态效果或省内存模式时关 */
|
|
104
|
+
danmaku() {
|
|
105
|
+
if (this.prefs.danmaku !== undefined)
|
|
106
|
+
return this.prefs.danmaku;
|
|
107
|
+
const reduce = typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches;
|
|
108
|
+
return !reduce && !this.h.lite();
|
|
109
|
+
}
|
|
110
|
+
setDanmaku(on) {
|
|
111
|
+
this.prefs.danmaku = on;
|
|
112
|
+
this.save();
|
|
113
|
+
if (!on) {
|
|
114
|
+
this.pending = [];
|
|
115
|
+
this.dm?.replaceChildren();
|
|
116
|
+
}
|
|
117
|
+
this.h.ui.querySelectorAll('[data-key="chat:danmaku"],[data-key="fun:danmaku"]').forEach((c) => (c.textContent = this.danmakuLabel()));
|
|
118
|
+
this.h.log?.(`弹幕 ${on ? '开' : '关'}`);
|
|
119
|
+
}
|
|
120
|
+
danmakuLabel() {
|
|
121
|
+
return `弹幕:${this.danmaku() ? '开' : '关'}`;
|
|
122
|
+
}
|
|
123
|
+
// ───────────── 摆放 ─────────────
|
|
124
|
+
/** on = 这会儿有聊天(游戏开了聊天、设置没关)。窗口变了、座位挪了由 TableFun.refresh 调 */
|
|
125
|
+
refresh(on) {
|
|
126
|
+
this.on = on;
|
|
127
|
+
const view = { width: window.innerWidth, height: window.innerHeight };
|
|
128
|
+
this.mode = chatMode(view);
|
|
129
|
+
this.font = chatFont(view, this.mode);
|
|
130
|
+
if (!on) {
|
|
131
|
+
this.clearDesk();
|
|
132
|
+
this.clearPhone();
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (this.mode === 'desk') {
|
|
136
|
+
this.clearPhone();
|
|
137
|
+
this.drawDesk(view);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
this.clearDesk();
|
|
141
|
+
this.drawPhone(view);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/** 聊天自己占的地方(气泡、弹幕要避开) */
|
|
145
|
+
rects() {
|
|
146
|
+
return [this.dockEl, this.pill, this.btn, this.bar].filter((e) => !!e).map((e) => e.getBoundingClientRect());
|
|
147
|
+
}
|
|
148
|
+
/** 有输入条或聊天框里的输入框正在用(游戏据此暂停快捷键) */
|
|
149
|
+
typing() {
|
|
150
|
+
return !!this.bar || this.doc.activeElement?.classList.contains('atc-input') === true;
|
|
151
|
+
}
|
|
152
|
+
clearDesk() {
|
|
153
|
+
this.dockEl?.remove();
|
|
154
|
+
this.pill?.remove();
|
|
155
|
+
if (this.dockEl)
|
|
156
|
+
this.logs.delete(this.dockEl.querySelector('.atc-log'));
|
|
157
|
+
this.dockEl = null;
|
|
158
|
+
this.pill = null;
|
|
159
|
+
}
|
|
160
|
+
clearPhone() {
|
|
161
|
+
this.btn?.remove();
|
|
162
|
+
this.btn = null;
|
|
163
|
+
this.closeBar();
|
|
164
|
+
}
|
|
165
|
+
drawDesk(view) {
|
|
166
|
+
const w = Math.round(this.font * 17);
|
|
167
|
+
const fixed = this.h.dock?.() ?? null;
|
|
168
|
+
if (this.prefs.folded) {
|
|
169
|
+
if (this.dockEl)
|
|
170
|
+
this.clearDesk();
|
|
171
|
+
if (!this.pill) {
|
|
172
|
+
const p = this.el('button', 'atc-pill');
|
|
173
|
+
p.type = 'button';
|
|
174
|
+
p.dataset['key'] = 'chat:open';
|
|
175
|
+
p.innerHTML = `${CHAT_ICON}<span>聊天</span>`;
|
|
176
|
+
p.addEventListener('click', (e) => {
|
|
177
|
+
e.stopPropagation();
|
|
178
|
+
this.fold(false);
|
|
179
|
+
});
|
|
180
|
+
this.h.ui.appendChild(p);
|
|
181
|
+
this.pill = p;
|
|
182
|
+
}
|
|
183
|
+
this.pill.style.fontSize = `${this.font - 2}px`;
|
|
184
|
+
this.pill.classList.toggle('atf-dot', this.unread);
|
|
185
|
+
const pw = this.pill.offsetWidth || 110;
|
|
186
|
+
const at = fixed ? { left: fixed.left, top: fixed.top } : placeDock(view, pw, 48, this.h.blocked());
|
|
187
|
+
this.pill.style.transform = `translate(${at.left}px,${at.top}px)`;
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
if (!this.dockEl)
|
|
191
|
+
this.dockEl = this.buildDock();
|
|
192
|
+
const d = this.dockEl;
|
|
193
|
+
d.style.fontSize = `${this.font - 2}px`;
|
|
194
|
+
d.style.width = `${fixed?.width ?? w}px`;
|
|
195
|
+
const log = d.querySelector('.atc-log');
|
|
196
|
+
const line = (this.font - 2) * 0.9 * 1.45 + 2;
|
|
197
|
+
// 按内容高度:最少两行(空的时候那句提示),最多 5 行;展开后最多半屏
|
|
198
|
+
log.style.minHeight = `${Math.round(line * 2)}px`;
|
|
199
|
+
log.style.maxHeight = `${Math.round(this.prefs.long ? Math.min(view.height * 0.5, line * ChatUi.KEEP) : line * 5)}px`;
|
|
200
|
+
const input = d.querySelector('.atc-input');
|
|
201
|
+
if (input)
|
|
202
|
+
input.disabled = !this.h.canSend();
|
|
203
|
+
const at = fixed ? { left: fixed.left, top: fixed.top } : placeDock(view, w, d.offsetHeight || 260, this.h.blocked());
|
|
204
|
+
d.style.transform = `translate(${at.left}px,${at.top}px)`;
|
|
205
|
+
log.scrollTop = log.scrollHeight;
|
|
206
|
+
}
|
|
207
|
+
buildDock() {
|
|
208
|
+
const d = this.el('div', 'atc-dock');
|
|
209
|
+
d.dataset['key'] = 'chat:dock';
|
|
210
|
+
d.addEventListener('pointerdown', (e) => e.stopPropagation());
|
|
211
|
+
const head = this.el('div', 'atc-head');
|
|
212
|
+
add(head, this.el('b', '', '聊天'), this.chip(this.danmakuLabel(), 'chat:danmaku', () => this.setDanmaku(!this.danmaku()), 'atf-soft'), this.chip(this.prefs.long ? '少看几条' : '展开记录', 'chat:more', () => {
|
|
213
|
+
this.prefs.long = !this.prefs.long;
|
|
214
|
+
this.save();
|
|
215
|
+
this.clearDesk();
|
|
216
|
+
this.refresh(this.on);
|
|
217
|
+
}, 'atf-soft'), this.chip('收起', 'chat:fold', () => this.fold(true), 'atf-grey'));
|
|
218
|
+
const log = this.el('div', 'atc-log');
|
|
219
|
+
this.logs.add(log);
|
|
220
|
+
const { row, note } = this.inputRow('chat', 'atc-input');
|
|
221
|
+
add(d, head, log, this.quick('chat'), row, note);
|
|
222
|
+
this.h.ui.appendChild(d);
|
|
223
|
+
this.render();
|
|
224
|
+
return d;
|
|
225
|
+
}
|
|
226
|
+
fold(on) {
|
|
227
|
+
this.prefs.folded = on;
|
|
228
|
+
this.save();
|
|
229
|
+
if (!on)
|
|
230
|
+
this.setUnread(false);
|
|
231
|
+
this.clearDesk();
|
|
232
|
+
this.refresh(this.on);
|
|
233
|
+
}
|
|
234
|
+
drawPhone(view) {
|
|
235
|
+
const r = this.h.button();
|
|
236
|
+
if (!r) {
|
|
237
|
+
this.clearPhone();
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
if (!this.btn) {
|
|
241
|
+
const b = this.el('button', 'atf-btn');
|
|
242
|
+
b.type = 'button';
|
|
243
|
+
b.dataset['key'] = 'chat:button';
|
|
244
|
+
b.innerHTML = `${CHAT_ICON}<span>聊天</span>`;
|
|
245
|
+
b.addEventListener('click', (e) => {
|
|
246
|
+
e.stopPropagation();
|
|
247
|
+
if (this.bar)
|
|
248
|
+
this.closeBar();
|
|
249
|
+
else
|
|
250
|
+
this.openBar();
|
|
251
|
+
});
|
|
252
|
+
this.h.ui.appendChild(b);
|
|
253
|
+
this.btn = b;
|
|
254
|
+
}
|
|
255
|
+
const b = this.btn;
|
|
256
|
+
this.h.styleButton(b);
|
|
257
|
+
const w = Math.max(44, r.width);
|
|
258
|
+
const hh = Math.max(44, r.height);
|
|
259
|
+
b.style.width = `${w}px`;
|
|
260
|
+
b.style.height = `${hh}px`;
|
|
261
|
+
b.classList.toggle('atf-dot', this.unread);
|
|
262
|
+
// 游戏给了位置就放那;不然挨着"互动"按钮(先右后左再上下),手牌、名牌、头像都避开
|
|
263
|
+
const own = this.h.chatButton?.() ?? null;
|
|
264
|
+
const at = own ? { left: own.left, top: own.top } : placeBeside(r, w, hh, view, this.h.blocked(), 4, 8);
|
|
265
|
+
if (own) {
|
|
266
|
+
b.style.width = `${Math.max(44, own.width)}px`;
|
|
267
|
+
b.style.height = `${Math.max(44, own.height)}px`;
|
|
268
|
+
}
|
|
269
|
+
b.style.transform = `translate(${at.left}px,${at.top}px)`;
|
|
270
|
+
if (this.bar)
|
|
271
|
+
this.placeBar();
|
|
272
|
+
}
|
|
273
|
+
/** 手机版输入条:快捷词一排、输入框、发送、记录、收起;贴在手牌和操作按钮上面 */
|
|
274
|
+
openBar() {
|
|
275
|
+
if (this.bar || !this.on)
|
|
276
|
+
return;
|
|
277
|
+
const bar = this.el('div', 'atc-bar');
|
|
278
|
+
bar.dataset['key'] = 'chat:bar';
|
|
279
|
+
bar.style.fontSize = `${this.font + 1}px`;
|
|
280
|
+
bar.addEventListener('pointerdown', (e) => e.stopPropagation());
|
|
281
|
+
const { row, note, input } = this.inputRow('chat', 'atc-input');
|
|
282
|
+
add(row, this.chip('记录', 'chat:history', () => {
|
|
283
|
+
this.closeBar();
|
|
284
|
+
this.h.history();
|
|
285
|
+
}, 'atf-soft'), this.chip('✕', 'chat:close', () => this.closeBar(), 'atf-grey'));
|
|
286
|
+
add(bar, this.quick('chat'), row, note);
|
|
287
|
+
this.h.ui.appendChild(bar);
|
|
288
|
+
this.bar = bar;
|
|
289
|
+
this.setUnread(false);
|
|
290
|
+
input.addEventListener('focus', () => this.hookViewport());
|
|
291
|
+
this.placeBar();
|
|
292
|
+
this.h.log?.('聊天 输入条');
|
|
293
|
+
}
|
|
294
|
+
closeBar() {
|
|
295
|
+
this.unhookViewport();
|
|
296
|
+
this.bar?.remove();
|
|
297
|
+
this.bar = null;
|
|
298
|
+
}
|
|
299
|
+
placeBar() {
|
|
300
|
+
const bar = this.bar;
|
|
301
|
+
if (!bar)
|
|
302
|
+
return;
|
|
303
|
+
const view = { width: window.innerWidth, height: window.innerHeight };
|
|
304
|
+
const h = bar.offsetHeight || 120;
|
|
305
|
+
let bottom = barBottom(view, h, [...this.h.barBlocked(), ...(this.btn ? [this.btn.getBoundingClientRect()] : [])]);
|
|
306
|
+
// 键盘弹起:可见区变矮,输入条跟着站到键盘上面
|
|
307
|
+
const vv = window.visualViewport;
|
|
308
|
+
if (vv && this.doc.activeElement?.classList.contains('atc-input'))
|
|
309
|
+
bottom = Math.min(bottom, vv.offsetTop + vv.height - 6);
|
|
310
|
+
bar.style.transform = `translateY(${Math.max(4, bottom - h)}px)`;
|
|
311
|
+
}
|
|
312
|
+
hookViewport() {
|
|
313
|
+
const vv = window.visualViewport;
|
|
314
|
+
if (!vv || this.vvFix)
|
|
315
|
+
return;
|
|
316
|
+
const fix = () => this.placeBar();
|
|
317
|
+
this.vvFix = fix;
|
|
318
|
+
vv.addEventListener('resize', fix);
|
|
319
|
+
vv.addEventListener('scroll', fix);
|
|
320
|
+
fix();
|
|
321
|
+
}
|
|
322
|
+
unhookViewport() {
|
|
323
|
+
const vv = typeof window !== 'undefined' ? window.visualViewport : null;
|
|
324
|
+
if (this.vvFix && vv) {
|
|
325
|
+
vv.removeEventListener('resize', this.vvFix);
|
|
326
|
+
vv.removeEventListener('scroll', this.vvFix);
|
|
327
|
+
}
|
|
328
|
+
this.vvFix = null;
|
|
329
|
+
}
|
|
330
|
+
// ───────────── 小部件 ─────────────
|
|
331
|
+
el(tag, cls, text) {
|
|
332
|
+
const e = this.doc.createElement(tag);
|
|
333
|
+
e.className = cls;
|
|
334
|
+
if (text !== undefined)
|
|
335
|
+
e.textContent = text;
|
|
336
|
+
return e;
|
|
337
|
+
}
|
|
338
|
+
chip(label, key, fn, cls = '') {
|
|
339
|
+
const c = this.el('button', `atf-chip ${cls}`.trim(), label);
|
|
340
|
+
c.type = 'button';
|
|
341
|
+
c.dataset['key'] = key;
|
|
342
|
+
c.addEventListener('click', (e) => {
|
|
343
|
+
e.stopPropagation();
|
|
344
|
+
fn();
|
|
345
|
+
});
|
|
346
|
+
return c;
|
|
347
|
+
}
|
|
348
|
+
/** 输入框上方那排快捷词:点了直接按短语发(冷却和互动共用,被冷却挡住时不发) */
|
|
349
|
+
quick(prefix) {
|
|
350
|
+
const q = this.el('div', 'atc-quick');
|
|
351
|
+
this.h.phrases.forEach((p, i) => add(q, this.chip(p, `${prefix}:phrase${i}`, () => this.h.phrase(i), 'atf-soft')));
|
|
352
|
+
return q;
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* 一行输入框 + 发送,下面一行小字(还能打几个字、为什么没发出去)。回车发送;被限速时"发送"倒计时。
|
|
356
|
+
* 电脑版聊天框、手机输入条、互动面板的聊天页共用
|
|
357
|
+
*/
|
|
358
|
+
inputRow(prefix, cls = '') {
|
|
359
|
+
const row = this.el('div', 'atc-row');
|
|
360
|
+
const input = this.el('input', `atf-input ${cls}`.trim());
|
|
361
|
+
input.type = 'text';
|
|
362
|
+
input.enterKeyHint = 'send';
|
|
363
|
+
input.autocomplete = 'off';
|
|
364
|
+
input.placeholder = '说点什么,回车发送';
|
|
365
|
+
input.dataset['key'] = prefix === 'fun' ? 'fun:chatInput' : `${prefix}:input`;
|
|
366
|
+
const send = this.chip('发送', prefix === 'fun' ? 'fun:chatSend' : `${prefix}:send`, () => go());
|
|
367
|
+
const note = this.el('div', 'atf-note');
|
|
368
|
+
const left = () => {
|
|
369
|
+
const n = CHAT_MAX - Array.from(input.value.trim()).length;
|
|
370
|
+
note.textContent = n < 0 ? `多了 ${-n} 个字` : input.value ? `还能打 ${n} 个字` : '';
|
|
371
|
+
send.disabled = n < 0 || send.dataset['wait'] === '1' || !this.h.canSend();
|
|
372
|
+
};
|
|
373
|
+
const go = () => {
|
|
374
|
+
if (!input.value.trim() || send.disabled)
|
|
375
|
+
return;
|
|
376
|
+
const r = this.h.send(input.value);
|
|
377
|
+
if (r.ok) {
|
|
378
|
+
input.value = '';
|
|
379
|
+
left();
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
note.textContent = chatRejectText(r.code, r.why);
|
|
383
|
+
if (r.code === 'chat_too_fast' && r.waitMs)
|
|
384
|
+
this.countdown(send, r.waitMs, left);
|
|
385
|
+
};
|
|
386
|
+
input.addEventListener('input', left);
|
|
387
|
+
input.addEventListener('keydown', (e) => {
|
|
388
|
+
// 打字时不让游戏的快捷键接到
|
|
389
|
+
e.stopPropagation();
|
|
390
|
+
if (e.key === 'Enter' && !e.isComposing)
|
|
391
|
+
go();
|
|
392
|
+
if (e.key === 'Escape')
|
|
393
|
+
input.blur();
|
|
394
|
+
});
|
|
395
|
+
add(row, input, send);
|
|
396
|
+
left();
|
|
397
|
+
return { row, note, input };
|
|
398
|
+
}
|
|
399
|
+
countdown(btn, ms, done) {
|
|
400
|
+
btn.dataset['wait'] = '1';
|
|
401
|
+
btn.disabled = true;
|
|
402
|
+
const end = this.h.now() + ms;
|
|
403
|
+
const tick = () => {
|
|
404
|
+
const s = Math.ceil((end - this.h.now()) / 1000);
|
|
405
|
+
if (s <= 0 || !btn.isConnected) {
|
|
406
|
+
btn.textContent = '发送';
|
|
407
|
+
delete btn.dataset['wait'];
|
|
408
|
+
done();
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
btn.textContent = `${s} 秒`;
|
|
412
|
+
this.h.later(Math.min(1000, end - this.h.now()), tick);
|
|
413
|
+
};
|
|
414
|
+
tick();
|
|
415
|
+
}
|
|
416
|
+
/** 房间拒了一条:看得见的小字行都说一声 */
|
|
417
|
+
note(text) {
|
|
418
|
+
this.h.ui.querySelectorAll('.atf-note').forEach((n) => (n.textContent = text));
|
|
419
|
+
}
|
|
420
|
+
// ───────────── 记录 ─────────────
|
|
421
|
+
/** 互动面板的聊天页挂上 / 摘下它的记录区 */
|
|
422
|
+
bindLog(el, old) {
|
|
423
|
+
if (old)
|
|
424
|
+
this.logs.delete(old);
|
|
425
|
+
if (el) {
|
|
426
|
+
this.logs.add(el);
|
|
427
|
+
this.renderOne(el);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
render() {
|
|
431
|
+
for (const el of this.logs)
|
|
432
|
+
this.renderOne(el);
|
|
433
|
+
}
|
|
434
|
+
renderOne(log) {
|
|
435
|
+
log.replaceChildren();
|
|
436
|
+
if (this.lines.length === 0)
|
|
437
|
+
add(log, this.el('div', 'atf-empty', '还没人说话。这里的话不保存,散了就没了'));
|
|
438
|
+
for (const m of this.lines) {
|
|
439
|
+
const row = this.el('div', '');
|
|
440
|
+
const b = this.el('b', '', `${m.name}:`);
|
|
441
|
+
b.style.color = seatColor(m.seat);
|
|
442
|
+
add(row, b, this.doc.createTextNode(m.text));
|
|
443
|
+
add(log, row);
|
|
444
|
+
}
|
|
445
|
+
log.scrollTop = log.scrollHeight;
|
|
446
|
+
}
|
|
447
|
+
/** 有人说了一句(打字或快捷短语):进记录、飘弹幕;看不见聊天的时候亮小红点 */
|
|
448
|
+
push(line, panelOpen) {
|
|
449
|
+
this.lines.push(line);
|
|
450
|
+
while (this.lines.length > ChatUi.KEEP)
|
|
451
|
+
this.lines.shift();
|
|
452
|
+
this.render();
|
|
453
|
+
if (!line.me && !panelOpen && !this.bar && !(this.mode === 'desk' && this.dockEl))
|
|
454
|
+
this.setUnread(true);
|
|
455
|
+
this.danmakuOf(line);
|
|
456
|
+
}
|
|
457
|
+
setUnread(on) {
|
|
458
|
+
this.unread = on;
|
|
459
|
+
this.btn?.classList.toggle('atf-dot', on);
|
|
460
|
+
this.pill?.classList.toggle('atf-dot', on);
|
|
461
|
+
}
|
|
462
|
+
// ───────────── 弹幕 ─────────────
|
|
463
|
+
danmakuOf(line) {
|
|
464
|
+
if (!this.on || !this.danmaku())
|
|
465
|
+
return;
|
|
466
|
+
const cap = this.mode === 'desk' ? DANMAKU.maxDesk : DANMAKU.maxPhone;
|
|
467
|
+
if (this.live >= cap || !this.fly(line)) {
|
|
468
|
+
// 满了或没有空轨道:排着,最多 DANMAKU.queue 条,再多丢最老的
|
|
469
|
+
this.pending.push(line);
|
|
470
|
+
while (this.pending.length > DANMAKU.queue)
|
|
471
|
+
this.pending.shift();
|
|
472
|
+
this.wake();
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* 弹幕区:游戏给了就用;不给是屏幕 8%–58%,上沿再压到最上面一排座位(头像顶边在屏高 20% 以内的,就是对家那一排)的头像、名牌下沿以下,
|
|
477
|
+
* 顶栏和对家名牌不被横穿;剩下不够两行时往下放宽(最多到 75%),不往上退
|
|
478
|
+
*/
|
|
479
|
+
area() {
|
|
480
|
+
const a = this.h.area?.();
|
|
481
|
+
if (a)
|
|
482
|
+
return a;
|
|
483
|
+
const w = window.innerWidth;
|
|
484
|
+
const hh = window.innerHeight;
|
|
485
|
+
const lineH = Math.round(this.font * 1.5) + 10;
|
|
486
|
+
const top = Math.max(Math.round(hh * 0.08), ...this.h.seatBoxes().filter((b) => b.top < hh * 0.2).map((b) => b.top + b.height + 4));
|
|
487
|
+
const bottom = Math.min(Math.round(hh * 0.75), Math.max(Math.round(hh * 0.58), top + lineH * 2));
|
|
488
|
+
return { left: 0, top, width: w, height: Math.max(0, bottom - top) };
|
|
489
|
+
}
|
|
490
|
+
/** 找空轨道飞一条;没有空的返回 false */
|
|
491
|
+
fly(line) {
|
|
492
|
+
const area = this.area();
|
|
493
|
+
// 弹幕层裁在弹幕区里(0.19.1):从区的右沿出现、左沿消失,不会飘出去擦过两边的座位
|
|
494
|
+
const vw = window.innerWidth;
|
|
495
|
+
const vh = window.innerHeight;
|
|
496
|
+
this.dmLayer().style.clipPath = `inset(${Math.max(0, area.top)}px ${Math.max(0, vw - area.left - area.width)}px ${Math.max(0, vh - area.top - area.height)}px ${Math.max(0, area.left)}px)`;
|
|
497
|
+
const lineH = Math.round(this.font * 1.5) + 10;
|
|
498
|
+
const lanes = danmakuLanes(area, lineH, [...this.h.blocked(), ...this.h.bubbles(), ...this.rects()], this.mode === 'desk' ? DANMAKU.lanesDesk : DANMAKU.lanesPhone);
|
|
499
|
+
if (lanes.length === 0)
|
|
500
|
+
return true;
|
|
501
|
+
if (this.freeAt.length !== lanes.length)
|
|
502
|
+
this.freeAt = lanes.map(() => 0);
|
|
503
|
+
const now = this.h.now();
|
|
504
|
+
const i = pickLane(this.freeAt, now);
|
|
505
|
+
if (i < 0)
|
|
506
|
+
return false;
|
|
507
|
+
const e = this.el('div', `atc-dm${line.me ? ' atc-me' : ''}`);
|
|
508
|
+
e.style.fontSize = `${this.font}px`;
|
|
509
|
+
const b = this.el('b', '', `${line.name}:`);
|
|
510
|
+
b.style.color = line.me ? '' : seatColor(line.seat);
|
|
511
|
+
add(e, b, this.doc.createTextNode(line.text));
|
|
512
|
+
this.dmLayer().appendChild(e);
|
|
513
|
+
const w = e.offsetWidth || line.text.length * this.font + 60;
|
|
514
|
+
const v = danmakuSpeed(area.width);
|
|
515
|
+
const y = lanes[i] + (lineH - (e.offsetHeight || lineH)) / 2;
|
|
516
|
+
this.freeAt[i] = now + (w + DANMAKU.gap) / v;
|
|
517
|
+
const from = `translate(${area.left + area.width}px,${y}px)`;
|
|
518
|
+
const to = `translate(${area.left - w}px,${y}px)`;
|
|
519
|
+
e.style.transform = from;
|
|
520
|
+
this.live++;
|
|
521
|
+
const done = () => {
|
|
522
|
+
e.remove();
|
|
523
|
+
this.live--;
|
|
524
|
+
this.wake();
|
|
525
|
+
};
|
|
526
|
+
if (typeof e.animate !== 'function') {
|
|
527
|
+
this.h.later((area.width + w) / v, done);
|
|
528
|
+
return true;
|
|
529
|
+
}
|
|
530
|
+
e.animate([{ transform: from }, { transform: to }], { duration: (area.width + w) / v, easing: 'linear', fill: 'both' }).finished.then(done, done);
|
|
531
|
+
return true;
|
|
532
|
+
}
|
|
533
|
+
/** 排着的弹幕:到最早那条轨道空出来时再试 */
|
|
534
|
+
wake() {
|
|
535
|
+
// 满了不用等:哪条飞完了 done 会再叫
|
|
536
|
+
if (this.waiting || this.pending.length === 0 || this.live >= (this.mode === 'desk' ? DANMAKU.maxDesk : DANMAKU.maxPhone))
|
|
537
|
+
return;
|
|
538
|
+
const now = this.h.now();
|
|
539
|
+
const ms = this.freeAt.length ? Math.max(50, Math.min(...this.freeAt) - now) : 200;
|
|
540
|
+
this.waiting = true;
|
|
541
|
+
this.h.later(ms, () => {
|
|
542
|
+
this.waiting = false;
|
|
543
|
+
if (!this.on || !this.danmaku()) {
|
|
544
|
+
this.pending = [];
|
|
545
|
+
return;
|
|
546
|
+
}
|
|
547
|
+
const cap = this.mode === 'desk' ? DANMAKU.maxDesk : DANMAKU.maxPhone;
|
|
548
|
+
while (this.pending.length && this.live < cap && this.fly(this.pending[0]))
|
|
549
|
+
this.pending.shift();
|
|
550
|
+
this.wake();
|
|
551
|
+
});
|
|
552
|
+
}
|
|
553
|
+
destroy() {
|
|
554
|
+
this.unhookViewport();
|
|
555
|
+
this.pending = [];
|
|
556
|
+
this.logs.clear();
|
|
557
|
+
this.dm?.remove();
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
//# sourceMappingURL=table-chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-chat.js","sourceRoot":"","sources":["../src/table-chat.ts"],"names":[],"mappings":"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"}
|