@yyyu-star/arcade-kit 0.10.2 → 0.11.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 +26 -0
- package/README.md +84 -3
- package/dist/client.d.ts +41 -8
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +119 -43
- package/dist/client.js.map +1 -1
- package/dist/fun-logic.d.ts +184 -0
- package/dist/fun-logic.d.ts.map +1 -0
- package/dist/fun-logic.js +249 -0
- package/dist/fun-logic.js.map +1 -0
- package/dist/fun.d.ts +1 -13
- package/dist/fun.d.ts.map +1 -1
- package/dist/fun.js +3 -2
- package/dist/fun.js.map +1 -1
- package/dist/room.d.ts +5 -0
- package/dist/room.d.ts.map +1 -1
- package/dist/room.js +24 -5
- package/dist/room.js.map +1 -1
- package/dist/table-fun.d.ts +152 -0
- package/dist/table-fun.d.ts.map +1 -0
- package/dist/table-fun.js +652 -0
- package/dist/table-fun.js.map +1 -0
- package/package.json +9 -1
- package/src/client.ts +119 -41
- package/src/fun-logic.ts +351 -0
- package/src/fun.ts +3 -2
- package/src/room.ts +28 -4
- package/src/table-fun.ts +713 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 牌桌互动组件(0.11.0,仓库根 docs/table-fun.md 第 0 节):头像菜单、互动面板、表情菜单、首次提示、冷却和护盾、连击和回敬、
|
|
3
|
+
* 电脑的反应、名场面横幅。几个牌桌游戏共用一套,外观、位置规则、动画、声音完全一样;游戏只做接线:
|
|
4
|
+
* 告诉组件每个座位的头像在屏幕上的矩形、名字、是不是电脑和互动性格,哪些地方不能盖(手牌、操作按钮),怎么把东西发出去,
|
|
5
|
+
* 再把收到的(好友房经房间转发的,单机自己的)交给 receive、把公开的名场面交给 moment。
|
|
6
|
+
*
|
|
7
|
+
* - DOM 实现:头像上盖一块透明的热区接点按和长按(画布游戏把世界坐标换成屏幕矩形传进来就行),菜单和面板是普通的 DOM,点按区 ≥ 44px;
|
|
8
|
+
* 效果(表情、道具、污渍)走 fun.ts 的图层,点击穿透。这个文件只在调用时碰 DOM,import 时不碰(房间、测试里 import 没事)。
|
|
9
|
+
* - 动画只动 transform、opacity;量位置(getBoundingClientRect)只在开菜单、给冒烟报控件时。
|
|
10
|
+
* - 公平:人人一样、免费;只是画面和声音,不停计时、不改规则;电脑的出牌不读这些。电脑的反应只在画面层(单机)或房间的互动钩子里算。
|
|
11
|
+
* - kit 不认识任何游戏:短语表、名场面的映射、电脑人物都由游戏给。
|
|
12
|
+
*/
|
|
13
|
+
import { type FunLayer, type FunPhase, type PropId, type RectLike } from './fun.js';
|
|
14
|
+
import { type BotReactConfig, type FunEvent, type FunMood, type FunTemper } from './fun-logic.js';
|
|
15
|
+
export * from './fun-logic.js';
|
|
16
|
+
export type { RectLike };
|
|
17
|
+
/** 一个座位此刻的样子(每次用到时现问,座位换人、头像挪了都跟得上) */
|
|
18
|
+
export interface FunSeat {
|
|
19
|
+
/** 头像的屏幕矩形(CSS 像素,getBoundingClientRect 的结果能直接传) */
|
|
20
|
+
rect: RectLike;
|
|
21
|
+
name: string;
|
|
22
|
+
/** 是我自己(点了出表情菜单,长按发上次那个表情) */
|
|
23
|
+
me?: boolean;
|
|
24
|
+
/** 是电脑(单机时组件替它反应;首次提示冒在电脑头像上) */
|
|
25
|
+
bot?: boolean;
|
|
26
|
+
/** 电脑的互动性格,默认 normal */
|
|
27
|
+
temper?: FunTemper;
|
|
28
|
+
}
|
|
29
|
+
export interface TableFunOptions {
|
|
30
|
+
/** 游戏 id:首次提示、屏蔽名单的存储 key 前缀(`<id>.hint.fun`、`<id>.fun.blocked`) */
|
|
31
|
+
storageKey: string;
|
|
32
|
+
/** 本游戏的短语表(编号 0..P-1,见 fun-logic 的 funItem) */
|
|
33
|
+
phrases: readonly string[];
|
|
34
|
+
/** 头像菜单里那 3 句点名短语(短语表的下标),默认前 3 句 */
|
|
35
|
+
named?: readonly number[];
|
|
36
|
+
/** 座位:下标就是发送、收到时用的座位号;空座位给 null */
|
|
37
|
+
seats(): readonly (FunSeat | null)[];
|
|
38
|
+
/** 菜单、面板不能盖的地方(手牌、操作按钮),屏幕矩形 */
|
|
39
|
+
avoid?(): readonly RectLike[];
|
|
40
|
+
/** "互动"按钮放哪(屏幕矩形,组件画按钮);null 就不画(比如没坐下) */
|
|
41
|
+
button?(): RectLike | null;
|
|
42
|
+
/** 发出去:好友房走 kit emote,单机直接回给 receive */
|
|
43
|
+
send(id: number, to?: number): void;
|
|
44
|
+
/** 现在能不能发(好友房:坐下了才能),默认能 */
|
|
45
|
+
canSend?(): boolean;
|
|
46
|
+
/** 设置里"互动:开 / 不看",关了别人的一律不播,单机电脑也不反应;默认开 */
|
|
47
|
+
enabled?(): boolean;
|
|
48
|
+
/** 屏蔽名单按这个分开(房间码;单机一个固定值),默认 'solo' */
|
|
49
|
+
scope?(): string;
|
|
50
|
+
/** 单机:电脑的反应由组件按 botReact 算、在本地播(好友房的电脑在房间里算,这里别开) */
|
|
51
|
+
localBots?: boolean;
|
|
52
|
+
/** 各种情绪时电脑气泡说的话;不给就用 kit 的默认(不提任何游戏) */
|
|
53
|
+
moodLines?: Partial<Record<FunMood, readonly string[]>>;
|
|
54
|
+
/** 道具声音:起飞、引信、命中时调,游戏用自己的音频(跟着静音开关)放 playFunSound */
|
|
55
|
+
sound?(prop: PropId, phase: FunPhase): void;
|
|
56
|
+
/** 命中那一刻:游戏让被扔的头像抖一下 */
|
|
57
|
+
onHit?(seat: number, prop: PropId): void;
|
|
58
|
+
/** 冒烟、调试看的流水:`道具 0>1:tomato ×2 回敬`、`表情 0:smug`、`短语 2:3`、`护盾 1`、`提示 头像` */
|
|
59
|
+
log?(line: string): void;
|
|
60
|
+
/** 效果图层的 z-index,菜单和热区在它上面一层;默认 50 */
|
|
61
|
+
zIndex?: number;
|
|
62
|
+
/** 电脑反应的参数,默认规范的数字 */
|
|
63
|
+
react?: BotReactConfig;
|
|
64
|
+
/** 测试、复现用 */
|
|
65
|
+
rand?(): number;
|
|
66
|
+
now?(): number;
|
|
67
|
+
}
|
|
68
|
+
type Tab = 'phrase' | 'sticker' | 'prop';
|
|
69
|
+
export declare class TableFun {
|
|
70
|
+
readonly layer: FunLayer;
|
|
71
|
+
private readonly ui;
|
|
72
|
+
private readonly doc;
|
|
73
|
+
private readonly o;
|
|
74
|
+
private readonly P;
|
|
75
|
+
private readonly cool;
|
|
76
|
+
private readonly tally;
|
|
77
|
+
private readonly bots;
|
|
78
|
+
private hots;
|
|
79
|
+
private btn;
|
|
80
|
+
private open;
|
|
81
|
+
private tab;
|
|
82
|
+
private target;
|
|
83
|
+
private lastProp;
|
|
84
|
+
private lastSticker;
|
|
85
|
+
private timers;
|
|
86
|
+
private dead;
|
|
87
|
+
private readonly onResize;
|
|
88
|
+
constructor(opts: TableFunOptions);
|
|
89
|
+
private now;
|
|
90
|
+
private rand;
|
|
91
|
+
private later;
|
|
92
|
+
private seat;
|
|
93
|
+
private meSeat;
|
|
94
|
+
private canSend;
|
|
95
|
+
private enabled;
|
|
96
|
+
/** 头像挪了、窗口变了、座位换人:重新摆热区和按钮(游戏重排画面后调;窗口 resize 自己会调) */
|
|
97
|
+
refresh(): void;
|
|
98
|
+
/** 头像热区:点一下开菜单(别人)或表情菜单(自己);按住 longPressMs 直接扔上次的道具 / 发上次的表情 */
|
|
99
|
+
private makeHot;
|
|
100
|
+
private tapSeat;
|
|
101
|
+
/** 长按:别人 → 扔上次那个道具;自己 → 发上次那个表情 */
|
|
102
|
+
private quick;
|
|
103
|
+
private pick;
|
|
104
|
+
private box;
|
|
105
|
+
private el;
|
|
106
|
+
private chip;
|
|
107
|
+
private cell;
|
|
108
|
+
/** 点别人头像:第一排 8 个道具(第一格是上次扔的那个),第二排 3 句点名短语,最后"屏蔽他" */
|
|
109
|
+
private openMenu;
|
|
110
|
+
/** 点自己头像:12 个表情 */
|
|
111
|
+
private openStickers;
|
|
112
|
+
/** "互动"按钮:短语 / 表情 / 道具三个页签;道具页先选人再选道具 */
|
|
113
|
+
openPanel(tab?: Tab): void;
|
|
114
|
+
closeAll(): void;
|
|
115
|
+
/** 有菜单或面板开着(游戏可以据此暂停自己的快捷键) */
|
|
116
|
+
isOpen(): boolean;
|
|
117
|
+
private blockKey;
|
|
118
|
+
private blockedNames;
|
|
119
|
+
isBlocked(seat: number): boolean;
|
|
120
|
+
setBlocked(seat: number, on: boolean): void;
|
|
121
|
+
/** 有人发了东西(好友房房间转发来的、单机自己的、电脑的):按种类播;别人的东西在关了互动、被屏蔽时不播 */
|
|
122
|
+
receive(from: number, id: number, to?: number): void;
|
|
123
|
+
private play;
|
|
124
|
+
/** 名场面(游戏把自己的公开事件映射过来):单机里电脑按性格起哄;横幅另由 banner 播 */
|
|
125
|
+
moment(ev: Extract<FunEvent, {
|
|
126
|
+
kind: 'moment';
|
|
127
|
+
}>): void;
|
|
128
|
+
private react;
|
|
129
|
+
/** 电脑的反应一定看得见:表情加一句话的气泡同时出;回敬再让道具飞过去 */
|
|
130
|
+
private perform;
|
|
131
|
+
private line;
|
|
132
|
+
/** 头像旁的一句话:朝屏幕中间那侧冒,2.4 秒后淡出 */
|
|
133
|
+
bubble(seat: number, text: string, ms?: number): void;
|
|
134
|
+
/** 头像上方冒一个字(×N、回敬!、护盾):放大弹一下再飘走 */
|
|
135
|
+
private flash;
|
|
136
|
+
/** 名场面横幅:屏幕上方居中一条红底金边,1.8 秒 */
|
|
137
|
+
banner(text: string, sub?: string): void;
|
|
138
|
+
/** 首次进牌桌:在一个电脑(没有就别人)头像旁说一句怎么玩,3 秒后收起,只出一次 */
|
|
139
|
+
private hint;
|
|
140
|
+
/** 游戏开自己的弹窗时藏起来(正在播的不中断),关掉后 show */
|
|
141
|
+
hide(): void;
|
|
142
|
+
show(): void;
|
|
143
|
+
/** 冒烟用:按钮、头像热区、开着的菜单里每一项的屏幕中心和大小(查点按区 ≥ 44) */
|
|
144
|
+
controls(): Record<string, {
|
|
145
|
+
x: number;
|
|
146
|
+
y: number;
|
|
147
|
+
w: number;
|
|
148
|
+
h: number;
|
|
149
|
+
}>;
|
|
150
|
+
destroy(): void;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=table-fun.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-fun.d.ts","sourceRoot":"","sources":["../src/table-fun.ts"],"names":[],"mappings":"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"}
|