@bct-app/game-model 0.1.0 → 0.1.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.
Files changed (43) hide show
  1. package/README.md +14 -10
  2. package/dist/index.d.ts +1172 -30
  3. package/dist/json-schema/ability-execution-timing.schema.json +8 -0
  4. package/dist/json-schema/ability.schema.json +2268 -0
  5. package/dist/json-schema/alignment-enum.schema.json +8 -0
  6. package/dist/json-schema/base-source.schema.json +64 -0
  7. package/dist/{schemas → json-schema}/character-basic-kind.schema.json +1 -1
  8. package/dist/{schemas → json-schema}/character-kind.schema.json +1 -1
  9. package/dist/json-schema/character.schema.json +123 -0
  10. package/dist/json-schema/chat-message-content.schema.json +65 -0
  11. package/dist/json-schema/chat-message-group.schema.json +37 -0
  12. package/dist/json-schema/chat-message-operation.schema.json +30 -0
  13. package/dist/json-schema/chat-message.schema.json +133 -0
  14. package/dist/json-schema/conversation.schema.json +252 -0
  15. package/dist/{schemas → json-schema}/effect.schema.json +375 -133
  16. package/dist/{schemas → json-schema}/game.schema.json +3 -16
  17. package/dist/json-schema/index.json +36 -0
  18. package/dist/{schemas → json-schema}/input.schema.json +108 -89
  19. package/dist/{schemas → json-schema}/message.schema.json +259 -35
  20. package/dist/json-schema/nomination.schema.json +29 -0
  21. package/dist/json-schema/operation.schema.json +28 -0
  22. package/dist/json-schema/player-display-format.schema.json +13 -0
  23. package/dist/json-schema/player-reminder.schema.json +19 -0
  24. package/dist/json-schema/player.schema.json +104 -0
  25. package/dist/json-schema/populated-character.schema.json +2344 -0
  26. package/dist/json-schema/populated-script.schema.json +2397 -0
  27. package/dist/json-schema/reminder.schema.json +24 -0
  28. package/dist/json-schema/room-create.schema.json +23 -0
  29. package/dist/json-schema/room-defaults.schema.json +72 -0
  30. package/dist/json-schema/room.schema.json +24 -0
  31. package/dist/json-schema/runtime-game.schema.json +162 -0
  32. package/dist/json-schema/script.schema.json +57 -0
  33. package/dist/json-schema/seat-side-enum.schema.json +9 -0
  34. package/dist/json-schema/special-message-kind.schema.json +7 -0
  35. package/dist/json-schema/target.schema.json +305 -0
  36. package/dist/json-schema/timeline.schema.json +87 -0
  37. package/dist/{schemas → json-schema}/view.schema.json +68 -42
  38. package/dist/zod.d.mts +4038 -0
  39. package/dist/zod.d.ts +4038 -0
  40. package/dist/zod.js +1129 -0
  41. package/dist/zod.mjs +1058 -0
  42. package/package.json +30 -15
  43. package/dist/schemas/index.json +0 -9
package/dist/index.d.ts CHANGED
@@ -5,7 +5,7 @@ export type TGame =
5
5
  numberOfPlayer: number;
6
6
  characterKinds: { kind: string; count: number; }[];
7
7
  characters: string[];
8
- seats: ({ userId: string; ready: boolean; } | null)[];
8
+ seats: (string | null)[];
9
9
  result:
10
10
  | "goodWin"
11
11
  | "evilWin";
@@ -14,6 +14,105 @@ export type TGame =
14
14
  endedAt: string;
15
15
  };
16
16
 
17
+ export type TRuntimeGame =
18
+ {
19
+ owner: string;
20
+ scriptId: string;
21
+ numberOfPlayer: number;
22
+ characterKinds: { kind: string; count: number; }[];
23
+ characters: string[];
24
+ createdAt: string;
25
+ status:
26
+ | "prepare"
27
+ | "start"
28
+ | "end";
29
+ seats: ({ userId: string; ready: boolean; } | null)[];
30
+ startedAt?:
31
+ | string
32
+ | undefined;
33
+ endedAt?:
34
+ | string
35
+ | undefined;
36
+ result?:
37
+ | "goodWin"
38
+ | "evilWin"
39
+ | "unexpectEnd"
40
+ | undefined;
41
+ settings?:
42
+ | {
43
+ operations: { abilityId: string; effector: number; payloads: any[]; visible?: boolean | undefined; }[];
44
+ }
45
+ | undefined;
46
+ };
47
+
48
+ export type TAlignment =
49
+ | "GOOD"
50
+ | "EVIL";
51
+
52
+ export type TTarget =
53
+ | {
54
+ from: "PAYLOAD";
55
+ value:
56
+ | number
57
+ | number[];
58
+ }
59
+ | {
60
+ from: "EFFECTOR";
61
+ }
62
+ | {
63
+ from: "DYNAMIC";
64
+ anchor?:
65
+ | {
66
+ from: "EFFECTOR";
67
+ }
68
+ | {
69
+ from: "PAYLOAD";
70
+ value:
71
+ | number
72
+ | number[];
73
+ }
74
+ | {
75
+ from: "STATIC";
76
+ value: number;
77
+ }
78
+ | undefined;
79
+ selector?:
80
+ | {
81
+ scope:
82
+ | "BOTH_SIDES"
83
+ | "LEFT_SIDE"
84
+ | "RIGHT_SIDE"
85
+ | {
86
+ from: "PAYLOAD";
87
+ value:
88
+ | number
89
+ | number[];
90
+ };
91
+ }
92
+ | undefined;
93
+ where?:
94
+ | {
95
+ mode:
96
+ | "ALL"
97
+ | "ANY";
98
+ conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[];
99
+ }
100
+ | undefined;
101
+ limit?:
102
+ | number
103
+ | {
104
+ from: "PAYLOAD";
105
+ value:
106
+ | number
107
+ | number[];
108
+ }
109
+ | undefined;
110
+ }
111
+ | {
112
+ from: "CUSTOM";
113
+ value: any;
114
+ };
115
+
17
116
  export type TEffect =
18
117
  | {
19
118
  type: "ABILITY_CHANGE";
@@ -38,11 +137,58 @@ export type TEffect =
38
137
  | {
39
138
  from: "EFFECTOR";
40
139
  }
140
+ | {
141
+ from: "DYNAMIC";
142
+ anchor?:
143
+ | {
144
+ from: "EFFECTOR";
145
+ }
146
+ | {
147
+ from: "PAYLOAD";
148
+ value:
149
+ | number
150
+ | number[];
151
+ }
152
+ | {
153
+ from: "STATIC";
154
+ value: number;
155
+ }
156
+ | undefined;
157
+ selector?:
158
+ | {
159
+ scope:
160
+ | "BOTH_SIDES"
161
+ | "LEFT_SIDE"
162
+ | "RIGHT_SIDE"
163
+ | {
164
+ from: "PAYLOAD";
165
+ value:
166
+ | number
167
+ | number[];
168
+ };
169
+ }
170
+ | undefined;
171
+ where?:
172
+ | {
173
+ mode:
174
+ | "ALL"
175
+ | "ANY";
176
+ conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[];
177
+ }
178
+ | undefined;
179
+ limit?:
180
+ | number
181
+ | {
182
+ from: "PAYLOAD";
183
+ value:
184
+ | number
185
+ | number[];
186
+ }
187
+ | undefined;
188
+ }
41
189
  | {
42
190
  from: "CUSTOM";
43
- value:
44
- | "ALL_TOWNSFOLK"
45
- | "ALL_PLAYERS";
191
+ value: any;
46
192
  };
47
193
  }
48
194
  | {
@@ -73,21 +219,85 @@ export type TEffect =
73
219
  | {
74
220
  from: "EFFECTOR";
75
221
  }
222
+ | {
223
+ from: "DYNAMIC";
224
+ anchor?:
225
+ | {
226
+ from: "EFFECTOR";
227
+ }
228
+ | {
229
+ from: "PAYLOAD";
230
+ value:
231
+ | number
232
+ | number[];
233
+ }
234
+ | {
235
+ from: "STATIC";
236
+ value: number;
237
+ }
238
+ | undefined;
239
+ selector?:
240
+ | {
241
+ scope:
242
+ | "BOTH_SIDES"
243
+ | "LEFT_SIDE"
244
+ | "RIGHT_SIDE"
245
+ | {
246
+ from: "PAYLOAD";
247
+ value:
248
+ | number
249
+ | number[];
250
+ };
251
+ }
252
+ | undefined;
253
+ where?:
254
+ | {
255
+ mode:
256
+ | "ALL"
257
+ | "ANY";
258
+ conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[];
259
+ }
260
+ | undefined;
261
+ limit?:
262
+ | number
263
+ | {
264
+ from: "PAYLOAD";
265
+ value:
266
+ | number
267
+ | number[];
268
+ }
269
+ | undefined;
270
+ }
76
271
  | {
77
272
  from: "CUSTOM";
78
- value:
79
- | "ALL_TOWNSFOLK"
80
- | "ALL_PLAYERS";
273
+ value: any;
81
274
  };
82
275
  }
83
276
  | {
84
277
  type: "CHARACTER_COUNT_CHANGE";
85
- kind:
278
+ source?:
279
+ | {
280
+ from: "CONSTANT";
281
+ value:
282
+ {
283
+ kind:
284
+ | "Townsfolk"
285
+ | "Outsiders"
286
+ | "Minions"
287
+ | "Demons";
288
+ value: number;
289
+ };
290
+ }
291
+ | undefined;
292
+ kind?:
86
293
  | "Townsfolk"
87
294
  | "Outsiders"
88
295
  | "Minions"
89
- | "Demons";
90
- value: number;
296
+ | "Demons"
297
+ | undefined;
298
+ value?:
299
+ | number
300
+ | undefined;
91
301
  }
92
302
  | {
93
303
  type: "CHARACTER_CHANGE";
@@ -115,11 +325,58 @@ export type TEffect =
115
325
  | {
116
326
  from: "EFFECTOR";
117
327
  }
328
+ | {
329
+ from: "DYNAMIC";
330
+ anchor?:
331
+ | {
332
+ from: "EFFECTOR";
333
+ }
334
+ | {
335
+ from: "PAYLOAD";
336
+ value:
337
+ | number
338
+ | number[];
339
+ }
340
+ | {
341
+ from: "STATIC";
342
+ value: number;
343
+ }
344
+ | undefined;
345
+ selector?:
346
+ | {
347
+ scope:
348
+ | "BOTH_SIDES"
349
+ | "LEFT_SIDE"
350
+ | "RIGHT_SIDE"
351
+ | {
352
+ from: "PAYLOAD";
353
+ value:
354
+ | number
355
+ | number[];
356
+ };
357
+ }
358
+ | undefined;
359
+ where?:
360
+ | {
361
+ mode:
362
+ | "ALL"
363
+ | "ANY";
364
+ conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[];
365
+ }
366
+ | undefined;
367
+ limit?:
368
+ | number
369
+ | {
370
+ from: "PAYLOAD";
371
+ value:
372
+ | number
373
+ | number[];
374
+ }
375
+ | undefined;
376
+ }
118
377
  | {
119
378
  from: "CUSTOM";
120
- value:
121
- | "ALL_TOWNSFOLK"
122
- | "ALL_PLAYERS";
379
+ value: any;
123
380
  };
124
381
  }
125
382
  | {
@@ -148,11 +405,58 @@ export type TEffect =
148
405
  | {
149
406
  from: "EFFECTOR";
150
407
  }
408
+ | {
409
+ from: "DYNAMIC";
410
+ anchor?:
411
+ | {
412
+ from: "EFFECTOR";
413
+ }
414
+ | {
415
+ from: "PAYLOAD";
416
+ value:
417
+ | number
418
+ | number[];
419
+ }
420
+ | {
421
+ from: "STATIC";
422
+ value: number;
423
+ }
424
+ | undefined;
425
+ selector?:
426
+ | {
427
+ scope:
428
+ | "BOTH_SIDES"
429
+ | "LEFT_SIDE"
430
+ | "RIGHT_SIDE"
431
+ | {
432
+ from: "PAYLOAD";
433
+ value:
434
+ | number
435
+ | number[];
436
+ };
437
+ }
438
+ | undefined;
439
+ where?:
440
+ | {
441
+ mode:
442
+ | "ALL"
443
+ | "ANY";
444
+ conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[];
445
+ }
446
+ | undefined;
447
+ limit?:
448
+ | number
449
+ | {
450
+ from: "PAYLOAD";
451
+ value:
452
+ | number
453
+ | number[];
454
+ }
455
+ | undefined;
456
+ }
151
457
  | {
152
458
  from: "CUSTOM";
153
- value:
154
- | "ALL_TOWNSFOLK"
155
- | "ALL_PLAYERS";
459
+ value: any;
156
460
  };
157
461
  followPriority?:
158
462
  | boolean
@@ -183,11 +487,58 @@ export type TEffect =
183
487
  | {
184
488
  from: "EFFECTOR";
185
489
  }
490
+ | {
491
+ from: "DYNAMIC";
492
+ anchor?:
493
+ | {
494
+ from: "EFFECTOR";
495
+ }
496
+ | {
497
+ from: "PAYLOAD";
498
+ value:
499
+ | number
500
+ | number[];
501
+ }
502
+ | {
503
+ from: "STATIC";
504
+ value: number;
505
+ }
506
+ | undefined;
507
+ selector?:
508
+ | {
509
+ scope:
510
+ | "BOTH_SIDES"
511
+ | "LEFT_SIDE"
512
+ | "RIGHT_SIDE"
513
+ | {
514
+ from: "PAYLOAD";
515
+ value:
516
+ | number
517
+ | number[];
518
+ };
519
+ }
520
+ | undefined;
521
+ where?:
522
+ | {
523
+ mode:
524
+ | "ALL"
525
+ | "ANY";
526
+ conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[];
527
+ }
528
+ | undefined;
529
+ limit?:
530
+ | number
531
+ | {
532
+ from: "PAYLOAD";
533
+ value:
534
+ | number
535
+ | number[];
536
+ }
537
+ | undefined;
538
+ }
186
539
  | {
187
540
  from: "CUSTOM";
188
- value:
189
- | "ALL_TOWNSFOLK"
190
- | "ALL_PLAYERS";
541
+ value: any;
191
542
  };
192
543
  }
193
544
  | {
@@ -216,11 +567,58 @@ export type TEffect =
216
567
  | {
217
568
  from: "EFFECTOR";
218
569
  }
570
+ | {
571
+ from: "DYNAMIC";
572
+ anchor?:
573
+ | {
574
+ from: "EFFECTOR";
575
+ }
576
+ | {
577
+ from: "PAYLOAD";
578
+ value:
579
+ | number
580
+ | number[];
581
+ }
582
+ | {
583
+ from: "STATIC";
584
+ value: number;
585
+ }
586
+ | undefined;
587
+ selector?:
588
+ | {
589
+ scope:
590
+ | "BOTH_SIDES"
591
+ | "LEFT_SIDE"
592
+ | "RIGHT_SIDE"
593
+ | {
594
+ from: "PAYLOAD";
595
+ value:
596
+ | number
597
+ | number[];
598
+ };
599
+ }
600
+ | undefined;
601
+ where?:
602
+ | {
603
+ mode:
604
+ | "ALL"
605
+ | "ANY";
606
+ conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[];
607
+ }
608
+ | undefined;
609
+ limit?:
610
+ | number
611
+ | {
612
+ from: "PAYLOAD";
613
+ value:
614
+ | number
615
+ | number[];
616
+ }
617
+ | undefined;
618
+ }
219
619
  | {
220
620
  from: "CUSTOM";
221
- value:
222
- | "ALL_TOWNSFOLK"
223
- | "ALL_PLAYERS";
621
+ value: any;
224
622
  };
225
623
  }
226
624
  | {
@@ -274,11 +672,58 @@ export type TEffect =
274
672
  | {
275
673
  from: "EFFECTOR";
276
674
  }
675
+ | {
676
+ from: "DYNAMIC";
677
+ anchor?:
678
+ | {
679
+ from: "EFFECTOR";
680
+ }
681
+ | {
682
+ from: "PAYLOAD";
683
+ value:
684
+ | number
685
+ | number[];
686
+ }
687
+ | {
688
+ from: "STATIC";
689
+ value: number;
690
+ }
691
+ | undefined;
692
+ selector?:
693
+ | {
694
+ scope:
695
+ | "BOTH_SIDES"
696
+ | "LEFT_SIDE"
697
+ | "RIGHT_SIDE"
698
+ | {
699
+ from: "PAYLOAD";
700
+ value:
701
+ | number
702
+ | number[];
703
+ };
704
+ }
705
+ | undefined;
706
+ where?:
707
+ | {
708
+ mode:
709
+ | "ALL"
710
+ | "ANY";
711
+ conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[];
712
+ }
713
+ | undefined;
714
+ limit?:
715
+ | number
716
+ | {
717
+ from: "PAYLOAD";
718
+ value:
719
+ | number
720
+ | number[];
721
+ }
722
+ | undefined;
723
+ }
277
724
  | {
278
725
  from: "CUSTOM";
279
- value:
280
- | "ALL_TOWNSFOLK"
281
- | "ALL_PLAYERS";
726
+ value: any;
282
727
  };
283
728
  }
284
729
  | {
@@ -304,11 +749,58 @@ export type TEffect =
304
749
  | {
305
750
  from: "EFFECTOR";
306
751
  }
752
+ | {
753
+ from: "DYNAMIC";
754
+ anchor?:
755
+ | {
756
+ from: "EFFECTOR";
757
+ }
758
+ | {
759
+ from: "PAYLOAD";
760
+ value:
761
+ | number
762
+ | number[];
763
+ }
764
+ | {
765
+ from: "STATIC";
766
+ value: number;
767
+ }
768
+ | undefined;
769
+ selector?:
770
+ | {
771
+ scope:
772
+ | "BOTH_SIDES"
773
+ | "LEFT_SIDE"
774
+ | "RIGHT_SIDE"
775
+ | {
776
+ from: "PAYLOAD";
777
+ value:
778
+ | number
779
+ | number[];
780
+ };
781
+ }
782
+ | undefined;
783
+ where?:
784
+ | {
785
+ mode:
786
+ | "ALL"
787
+ | "ANY";
788
+ conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[];
789
+ }
790
+ | undefined;
791
+ limit?:
792
+ | number
793
+ | {
794
+ from: "PAYLOAD";
795
+ value:
796
+ | number
797
+ | number[];
798
+ }
799
+ | undefined;
800
+ }
307
801
  | {
308
802
  from: "CUSTOM";
309
- value:
310
- | "ALL_TOWNSFOLK"
311
- | "ALL_PLAYERS";
803
+ value: any;
312
804
  };
313
805
  };
314
806
 
@@ -465,8 +957,24 @@ export type TInput =
465
957
  readonly?:
466
958
  | boolean
467
959
  | undefined;
960
+ }
961
+ | {
962
+ type: "SEAT_SIDE";
963
+ title?:
964
+ | string
965
+ | undefined;
966
+ footer?:
967
+ | string
968
+ | undefined;
969
+ readonly?:
970
+ | boolean
971
+ | undefined;
468
972
  };
469
973
 
974
+ export type TRange =
975
+ | [number, number]
976
+ | [number];
977
+
470
978
  export type TView =
471
979
  | {
472
980
  source:
@@ -611,14 +1119,109 @@ export type TView =
611
1119
  value: any;
612
1120
  };
613
1121
  type: "PLAYER_REMINDER";
1122
+ }
1123
+ | {
1124
+ source:
1125
+ | {
1126
+ from: "PAYLOAD";
1127
+ value:
1128
+ | number
1129
+ | number[];
1130
+ }
1131
+ | {
1132
+ from: "CONSTANT";
1133
+ value: any;
1134
+ };
1135
+ type: "SEAT_SIDE";
614
1136
  };
615
1137
 
616
1138
  export type TMessage =
617
1139
  {
618
- targets: ({ from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "CUSTOM"; value: "ALL_TOWNSFOLK" | "ALL_PLAYERS"; })[];
619
- content: ({ type: "PAYLOAD"; value: number | number[]; payloadType: "PLAYER"; options: { format: "NUMBER_AND_CHARACTER" | "NUMBER_ONLY" | "CHARACTER_ONLY" | "ALIGNMENT_ONLY"; }; } | { type: "PAYLOAD"; value: number | number[]; payloadType: "BOOLEAN"; options?: { texts?: [string, string] | undefined; style?: ("TEXT" | "ICON")[] | undefined; colors?: [(string | undefined)?, (string | undefined)?] | undefined; } | undefined; } | { type: "PAYLOAD"; value: number | number[]; payloadType: "ALIGNMENT" | "CHARACTER" | "CHARACTER_KIND" | "NUMBER" | "REMINDER" | "PLAYER_REMINDER" | "STATUS" | "TEXT"; options: Record<string, never>; } | { type: "TEXT"; value: string; } | { type: "EFFECTOR"; options: { format: "NUMBER_AND_CHARACTER" | "NUMBER_ONLY" | "CHARACTER_ONLY" | "ALIGNMENT_ONLY"; }; } | { type: "SPECIAL"; kind: "SPY"; })[];
1140
+ targets: ({ from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; })[];
1141
+ content: ({ type: "PAYLOAD"; value: number | number[]; payloadType: "PLAYER"; options: { format: "NUMBER_AND_CHARACTER" | "NUMBER_ONLY" | "CHARACTER_ONLY" | "ALIGNMENT_ONLY"; }; } | { type: "PAYLOAD"; value: number | number[]; payloadType: "BOOLEAN"; options?: { texts?: [string, string] | undefined; style?: ("TEXT" | "ICON")[] | undefined; colors?: [(string | undefined)?, (string | undefined)?] | undefined; } | undefined; } | { type: "PAYLOAD"; value: number | number[]; payloadType: "CHARACTER_KIND" | "ALIGNMENT" | "CHARACTER" | "NUMBER" | "REMINDER" | "PLAYER_REMINDER" | "SEAT_SIDE" | "STATUS" | "TEXT"; options: Record<string, never>; } | { type: "TEXT"; value: string; } | { type: "EFFECTOR"; options: { format: "NUMBER_AND_CHARACTER" | "NUMBER_ONLY" | "CHARACTER_ONLY" | "ALIGNMENT_ONLY"; }; } | { type: "SPECIAL"; kind: "SPY"; })[];
1142
+ };
1143
+
1144
+ export type TSpecialMessageKind = "SPY";
1145
+
1146
+ export type TMessageTemplateSegment =
1147
+ | {
1148
+ type: "PAYLOAD";
1149
+ value:
1150
+ | number
1151
+ | number[];
1152
+ payloadType: "PLAYER";
1153
+ options:
1154
+ {
1155
+ format:
1156
+ | "NUMBER_AND_CHARACTER"
1157
+ | "NUMBER_ONLY"
1158
+ | "CHARACTER_ONLY"
1159
+ | "ALIGNMENT_ONLY";
1160
+ };
1161
+ }
1162
+ | {
1163
+ type: "PAYLOAD";
1164
+ value:
1165
+ | number
1166
+ | number[];
1167
+ payloadType: "BOOLEAN";
1168
+ options?:
1169
+ | {
1170
+ texts?:
1171
+ | [string, string]
1172
+ | undefined;
1173
+ style?:
1174
+ | ("TEXT" | "ICON")[]
1175
+ | undefined;
1176
+ colors?:
1177
+ | [(string | undefined)?, (string | undefined)?]
1178
+ | undefined;
1179
+ }
1180
+ | undefined;
1181
+ }
1182
+ | {
1183
+ type: "PAYLOAD";
1184
+ value:
1185
+ | number
1186
+ | number[];
1187
+ payloadType:
1188
+ | "CHARACTER_KIND"
1189
+ | "ALIGNMENT"
1190
+ | "CHARACTER"
1191
+ | "NUMBER"
1192
+ | "REMINDER"
1193
+ | "PLAYER_REMINDER"
1194
+ | "SEAT_SIDE"
1195
+ | "STATUS"
1196
+ | "TEXT";
1197
+ options: Record<string, never>;
1198
+ }
1199
+ | {
1200
+ type: "TEXT";
1201
+ value: string;
1202
+ }
1203
+ | {
1204
+ type: "EFFECTOR";
1205
+ options:
1206
+ {
1207
+ format:
1208
+ | "NUMBER_AND_CHARACTER"
1209
+ | "NUMBER_ONLY"
1210
+ | "CHARACTER_ONLY"
1211
+ | "ALIGNMENT_ONLY";
1212
+ };
1213
+ }
1214
+ | {
1215
+ type: "SPECIAL";
1216
+ kind: "SPY";
620
1217
  };
621
1218
 
1219
+ export type TPlayerDisplayFormat =
1220
+ | "NUMBER_AND_CHARACTER"
1221
+ | "NUMBER_ONLY"
1222
+ | "CHARACTER_ONLY"
1223
+ | "ALIGNMENT_ONLY";
1224
+
622
1225
  export type TCharacterKind =
623
1226
  | "Townsfolk"
624
1227
  | "Outsiders"
@@ -631,3 +1234,542 @@ export type TCharacterBasicKind =
631
1234
  | "Outsiders"
632
1235
  | "Minions"
633
1236
  | "Demons";
1237
+
1238
+ export type TCharacterKindCount =
1239
+ {
1240
+ kind:
1241
+ | "Townsfolk"
1242
+ | "Outsiders"
1243
+ | "Minions"
1244
+ | "Demons";
1245
+ count: number;
1246
+ };
1247
+
1248
+ export type TCharacterKinds = { kind: "Townsfolk" | "Outsiders" | "Minions" | "Demons"; count: number; }[];
1249
+
1250
+ export type TSeatSide =
1251
+ | "BOTH_SIDES"
1252
+ | "LEFT_SIDE"
1253
+ | "RIGHT_SIDE";
1254
+
1255
+ export type TPlayer =
1256
+ {
1257
+ seat: number;
1258
+ characterId: string;
1259
+ abilities: string[];
1260
+ user?:
1261
+ | {
1262
+ userId: string;
1263
+ ready: boolean;
1264
+ }
1265
+ | undefined;
1266
+ perceivedCharacter?:
1267
+ | {
1268
+ characterId: string;
1269
+ abilities: string[];
1270
+ asCharacter?:
1271
+ | boolean
1272
+ | undefined;
1273
+ }
1274
+ | undefined;
1275
+ reminders?:
1276
+ | { mark: string; color?: string | undefined; description?: string | undefined; duration?: number | undefined; }[]
1277
+ | undefined;
1278
+ alignment?:
1279
+ | "GOOD"
1280
+ | "EVIL"
1281
+ | undefined;
1282
+ isDead?:
1283
+ | boolean
1284
+ | undefined;
1285
+ hasUsedDeadVote?:
1286
+ | boolean
1287
+ | undefined;
1288
+ };
1289
+
1290
+ export type TTimeline =
1291
+ {
1292
+ turn: number;
1293
+ time:
1294
+ | "day"
1295
+ | "night";
1296
+ operations: { abilityId: string; effector: number; payloads: any[]; visible?: boolean | undefined; }[];
1297
+ nominations?:
1298
+ | { nominator: number; nominee: number; voterSeats: number[]; inRack?: boolean | undefined; }[]
1299
+ | undefined;
1300
+ };
1301
+
1302
+ export type TOperation =
1303
+ {
1304
+ abilityId: string;
1305
+ effector: number;
1306
+ payloads: any[];
1307
+ visible?:
1308
+ | boolean
1309
+ | undefined;
1310
+ };
1311
+
1312
+ export type TNomination =
1313
+ {
1314
+ nominator: number;
1315
+ nominee: number;
1316
+ voterSeats: number[];
1317
+ inRack?:
1318
+ | boolean
1319
+ | undefined;
1320
+ };
1321
+
1322
+ export type TReminder =
1323
+ {
1324
+ mark: string;
1325
+ color?:
1326
+ | string
1327
+ | undefined;
1328
+ description?:
1329
+ | string
1330
+ | undefined;
1331
+ duration?:
1332
+ | number
1333
+ | undefined;
1334
+ };
1335
+
1336
+ export type TPlayerReminder =
1337
+ {
1338
+ playerSeat: number;
1339
+ index: number;
1340
+ };
1341
+
1342
+ export type TSource =
1343
+ | {
1344
+ from: "PAYLOAD";
1345
+ value:
1346
+ | number
1347
+ | number[];
1348
+ }
1349
+ | {
1350
+ from: "CONSTANT";
1351
+ value: any;
1352
+ };
1353
+
1354
+ export type TRoom =
1355
+ {
1356
+ roomId: string;
1357
+ hostId: string;
1358
+ createdAt: string;
1359
+ };
1360
+
1361
+ export type TRoomCreate =
1362
+ {
1363
+ roomId: string;
1364
+ hostId: string;
1365
+ createdAt?:
1366
+ | string
1367
+ | undefined;
1368
+ };
1369
+
1370
+ export type TRoomDefaults =
1371
+ {
1372
+ defaultScriptId: string;
1373
+ defaultCharacterKinds: { kind: "Townsfolk" | "Outsiders" | "Minions" | "Demons"; count: number; }[];
1374
+ defaultNumberOfPlayer: number;
1375
+ };
1376
+
1377
+ export type TChatMessageGroup =
1378
+ {
1379
+ groupId: string;
1380
+ name: string;
1381
+ userIds: string[];
1382
+ createdAt: string;
1383
+ };
1384
+
1385
+ export type TChatMessage =
1386
+ {
1387
+ id: string;
1388
+ roomId: string;
1389
+ sender: string;
1390
+ target:
1391
+ {
1392
+ type:
1393
+ | "DIRECT"
1394
+ | "GROUP";
1395
+ id: string;
1396
+ };
1397
+ content:
1398
+ | {
1399
+ type: "text";
1400
+ text: string;
1401
+ }
1402
+ | {
1403
+ type: "operation";
1404
+ operation:
1405
+ {
1406
+ type: string;
1407
+ payload: Record<string, any>;
1408
+ meta?:
1409
+ | Record<string, any>
1410
+ | undefined;
1411
+ };
1412
+ };
1413
+ createdAt: string;
1414
+ version: number;
1415
+ updatedAt?:
1416
+ | string
1417
+ | undefined;
1418
+ metadata?:
1419
+ | Record<string, any>
1420
+ | undefined;
1421
+ };
1422
+
1423
+ export type TChatMessageContent =
1424
+ | {
1425
+ type: "text";
1426
+ text: string;
1427
+ }
1428
+ | {
1429
+ type: "operation";
1430
+ operation:
1431
+ {
1432
+ type: string;
1433
+ payload: Record<string, any>;
1434
+ meta?:
1435
+ | Record<string, any>
1436
+ | undefined;
1437
+ };
1438
+ };
1439
+
1440
+ export type TChatMessageOperation =
1441
+ {
1442
+ type: string;
1443
+ payload: Record<string, any>;
1444
+ meta?:
1445
+ | Record<string, any>
1446
+ | undefined;
1447
+ };
1448
+
1449
+ export type TConversation =
1450
+ | {
1451
+ targetId: string;
1452
+ type: "DIRECT";
1453
+ role:
1454
+ | "PLAYER"
1455
+ | "STORYTELLER";
1456
+ userIds: [string, string];
1457
+ lastMessage?:
1458
+ | {
1459
+ id: string;
1460
+ roomId: string;
1461
+ sender: string;
1462
+ target:
1463
+ {
1464
+ type:
1465
+ | "DIRECT"
1466
+ | "GROUP";
1467
+ id: string;
1468
+ };
1469
+ content:
1470
+ | {
1471
+ type: "text";
1472
+ text: string;
1473
+ }
1474
+ | {
1475
+ type: "operation";
1476
+ operation:
1477
+ {
1478
+ type: string;
1479
+ payload: Record<string, any>;
1480
+ meta?:
1481
+ | Record<string, any>
1482
+ | undefined;
1483
+ };
1484
+ };
1485
+ createdAt: string;
1486
+ version: number;
1487
+ updatedAt?:
1488
+ | string
1489
+ | undefined;
1490
+ metadata?:
1491
+ | Record<string, any>
1492
+ | undefined;
1493
+ }
1494
+ | undefined;
1495
+ lastMessageTime?:
1496
+ | string
1497
+ | undefined;
1498
+ }
1499
+ | {
1500
+ targetId: string;
1501
+ type: "GROUP";
1502
+ targetName: string;
1503
+ groupData:
1504
+ {
1505
+ groupId: string;
1506
+ name: string;
1507
+ userIds: string[];
1508
+ createdAt: string;
1509
+ };
1510
+ lastMessage?:
1511
+ | {
1512
+ id: string;
1513
+ roomId: string;
1514
+ sender: string;
1515
+ target:
1516
+ {
1517
+ type:
1518
+ | "DIRECT"
1519
+ | "GROUP";
1520
+ id: string;
1521
+ };
1522
+ content:
1523
+ | {
1524
+ type: "text";
1525
+ text: string;
1526
+ }
1527
+ | {
1528
+ type: "operation";
1529
+ operation:
1530
+ {
1531
+ type: string;
1532
+ payload: Record<string, any>;
1533
+ meta?:
1534
+ | Record<string, any>
1535
+ | undefined;
1536
+ };
1537
+ };
1538
+ createdAt: string;
1539
+ version: number;
1540
+ updatedAt?:
1541
+ | string
1542
+ | undefined;
1543
+ metadata?:
1544
+ | Record<string, any>
1545
+ | undefined;
1546
+ }
1547
+ | undefined;
1548
+ lastMessageTime?:
1549
+ | string
1550
+ | undefined;
1551
+ };
1552
+
1553
+ export type TDirectConversation =
1554
+ {
1555
+ targetId: string;
1556
+ type: "DIRECT";
1557
+ role:
1558
+ | "PLAYER"
1559
+ | "STORYTELLER";
1560
+ userIds: [string, string];
1561
+ lastMessage?:
1562
+ | {
1563
+ id: string;
1564
+ roomId: string;
1565
+ sender: string;
1566
+ target:
1567
+ {
1568
+ type:
1569
+ | "DIRECT"
1570
+ | "GROUP";
1571
+ id: string;
1572
+ };
1573
+ content:
1574
+ | {
1575
+ type: "text";
1576
+ text: string;
1577
+ }
1578
+ | {
1579
+ type: "operation";
1580
+ operation:
1581
+ {
1582
+ type: string;
1583
+ payload: Record<string, any>;
1584
+ meta?:
1585
+ | Record<string, any>
1586
+ | undefined;
1587
+ };
1588
+ };
1589
+ createdAt: string;
1590
+ version: number;
1591
+ updatedAt?:
1592
+ | string
1593
+ | undefined;
1594
+ metadata?:
1595
+ | Record<string, any>
1596
+ | undefined;
1597
+ }
1598
+ | undefined;
1599
+ lastMessageTime?:
1600
+ | string
1601
+ | undefined;
1602
+ };
1603
+
1604
+ export type TGroupConversation =
1605
+ {
1606
+ targetId: string;
1607
+ type: "GROUP";
1608
+ targetName: string;
1609
+ groupData:
1610
+ {
1611
+ groupId: string;
1612
+ name: string;
1613
+ userIds: string[];
1614
+ createdAt: string;
1615
+ };
1616
+ lastMessage?:
1617
+ | {
1618
+ id: string;
1619
+ roomId: string;
1620
+ sender: string;
1621
+ target:
1622
+ {
1623
+ type:
1624
+ | "DIRECT"
1625
+ | "GROUP";
1626
+ id: string;
1627
+ };
1628
+ content:
1629
+ | {
1630
+ type: "text";
1631
+ text: string;
1632
+ }
1633
+ | {
1634
+ type: "operation";
1635
+ operation:
1636
+ {
1637
+ type: string;
1638
+ payload: Record<string, any>;
1639
+ meta?:
1640
+ | Record<string, any>
1641
+ | undefined;
1642
+ };
1643
+ };
1644
+ createdAt: string;
1645
+ version: number;
1646
+ updatedAt?:
1647
+ | string
1648
+ | undefined;
1649
+ metadata?:
1650
+ | Record<string, any>
1651
+ | undefined;
1652
+ }
1653
+ | undefined;
1654
+ lastMessageTime?:
1655
+ | string
1656
+ | undefined;
1657
+ };
1658
+
1659
+ export type TScript =
1660
+ {
1661
+ id: string;
1662
+ name: string;
1663
+ cover: string;
1664
+ characters: string[];
1665
+ orderInFirstNight: string[];
1666
+ orderInOtherNight: string[];
1667
+ isEnabled: boolean;
1668
+ createdAt: string;
1669
+ };
1670
+
1671
+ export type TPopulatedScript =
1672
+ {
1673
+ id: string;
1674
+ name: string;
1675
+ cover: string;
1676
+ orderInFirstNight: string[];
1677
+ orderInOtherNight: string[];
1678
+ isEnabled: boolean;
1679
+ createdAt: string;
1680
+ characters: { id: string; name: string; key: string; kind: "Townsfolk" | "Outsiders" | "Minions" | "Demons"; createdAt: string; abilities: { id: string; name: string; description: string; stage: "PREPARE" | "CHARACTER_SELECTION" | "PLAYING"; category: "CHARACTER" | "STORYTELLER"; executionTiming: "NORMAL" | "DEFER_TO_END"; inputs: ({ type: "PLAYER"; layout: "ROUND" | "ROW"; kinds: ("Townsfolk" | "Outsiders" | "Minions" | "Demons")[]; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; filterToken?: string | undefined; range?: [number, number] | [number] | undefined; } | { type: "CHARACTER"; kinds: ("Townsfolk" | "Outsiders" | "Minions" | "Demons")[]; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; filterToken?: string | undefined; range?: [number, number] | [number] | undefined; } | { type: "ALIGNMENT"; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; } | { type: "CHARACTER_KIND"; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; } | { type: "BOOLEAN"; style: "RADIO" | "SWITCH"; defaultValue: boolean; texts: [string, string]; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; prompt?: string | undefined; } | { type: "NUMBER"; range: [number, number] | [number]; style: "SELECTION" | "INPUT"; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; } | { type: "TEXT"; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; } | { type: "STATUS"; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; } | { type: "REMINDER"; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; } | { type: "PLAYER_REMINDER"; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; } | { type: "SEAT_SIDE"; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; })[]; views: ({ source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "CHARACTER"; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "CHARACTER_KIND"; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "ALIGNMENT"; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "NUMBER"; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "PLAYER"; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "BOOLEAN"; texts: [string, string]; style: ("TEXT" | "ICON")[]; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "TEXT"; color: string; fontSize: number; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "STATUS"; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "REMINDER"; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "PLAYER_REMINDER"; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "SEAT_SIDE"; })[]; effects: ({ type: "ABILITY_CHANGE"; source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: string; }; target: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; }; } | { type: "ALIGNMENT_CHANGE"; source: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "CONSTANT"; value: "GOOD" | "EVIL"; }; target: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; }; } | { type: "CHARACTER_COUNT_CHANGE"; source?: { from: "CONSTANT"; value: { kind: "Townsfolk" | "Outsiders" | "Minions" | "Demons"; value: number; }; } | undefined; kind?: "Townsfolk" | "Outsiders" | "Minions" | "Demons" | undefined; value?: number | undefined; } | { type: "CHARACTER_CHANGE"; source: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "CONSTANT"; value: string; }; target: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; }; } | { type: "PERCEIVED_CHARACTER_CHANGE"; source: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "CONSTANT"; value: string; }; target: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; }; followPriority?: boolean | undefined; } | { type: "STATUS_CHANGE"; source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: "DEAD" | "ALIVE"; }; target: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; }; } | { type: "SEAT_CHANGE"; source: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "CONSTANT"; value: number; }; target: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; }; } | { type: "GAME_CHANGE"; source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: "GOOD" | "EVIL"; }; } | { type: "REMINDER_ADD"; source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: { mark: string; color?: string | undefined; description?: string | undefined; duration?: number | undefined; }; }; target: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; }; } | { type: "REMINDER_REMOVE"; source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: number; }; target: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; }; })[]; messages: { targets: ({ from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; })[]; content: ({ type: "PAYLOAD"; value: number | number[]; payloadType: "PLAYER"; options: { format: "NUMBER_AND_CHARACTER" | "NUMBER_ONLY" | "CHARACTER_ONLY" | "ALIGNMENT_ONLY"; }; } | { type: "PAYLOAD"; value: number | number[]; payloadType: "BOOLEAN"; options?: { texts?: [string, string] | undefined; style?: ("TEXT" | "ICON")[] | undefined; colors?: [(string | undefined)?, (string | undefined)?] | undefined; } | undefined; } | { type: "PAYLOAD"; value: number | number[]; payloadType: "CHARACTER_KIND" | "ALIGNMENT" | "CHARACTER" | "NUMBER" | "REMINDER" | "PLAYER_REMINDER" | "SEAT_SIDE" | "STATUS" | "TEXT"; options: Record<string, never>; } | { type: "TEXT"; value: string; } | { type: "EFFECTOR"; options: { format: "NUMBER_AND_CHARACTER" | "NUMBER_ONLY" | "CHARACTER_ONLY" | "ALIGNMENT_ONLY"; }; } | { type: "SPECIAL"; kind: "SPY"; })[]; }[]; scope: "EVERYONE" | "STORYTELLER_ONLY"; createdAt: string; bio?: string | undefined; tags?: string[] | null | undefined; }[]; icon?: string | undefined; skill?: string | null | undefined; saying?: string | null | undefined; tags?: string[] | null | undefined; }[];
1681
+ };
1682
+
1683
+ export type TCharacter =
1684
+ {
1685
+ id: string;
1686
+ name: string;
1687
+ key: string;
1688
+ kind:
1689
+ | "Townsfolk"
1690
+ | "Outsiders"
1691
+ | "Minions"
1692
+ | "Demons";
1693
+ abilities: string[];
1694
+ createdAt: string;
1695
+ icon?:
1696
+ | string
1697
+ | undefined;
1698
+ skill?:
1699
+ | string
1700
+ | null
1701
+ | undefined;
1702
+ saying?:
1703
+ | string
1704
+ | null
1705
+ | undefined;
1706
+ tags?:
1707
+ | string[]
1708
+ | null
1709
+ | undefined;
1710
+ };
1711
+
1712
+ export type TPopulatedCharacter =
1713
+ {
1714
+ id: string;
1715
+ name: string;
1716
+ key: string;
1717
+ kind:
1718
+ | "Townsfolk"
1719
+ | "Outsiders"
1720
+ | "Minions"
1721
+ | "Demons";
1722
+ createdAt: string;
1723
+ abilities: { id: string; name: string; description: string; stage: "PREPARE" | "CHARACTER_SELECTION" | "PLAYING"; category: "CHARACTER" | "STORYTELLER"; executionTiming: "NORMAL" | "DEFER_TO_END"; inputs: ({ type: "PLAYER"; layout: "ROUND" | "ROW"; kinds: ("Townsfolk" | "Outsiders" | "Minions" | "Demons")[]; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; filterToken?: string | undefined; range?: [number, number] | [number] | undefined; } | { type: "CHARACTER"; kinds: ("Townsfolk" | "Outsiders" | "Minions" | "Demons")[]; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; filterToken?: string | undefined; range?: [number, number] | [number] | undefined; } | { type: "ALIGNMENT"; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; } | { type: "CHARACTER_KIND"; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; } | { type: "BOOLEAN"; style: "RADIO" | "SWITCH"; defaultValue: boolean; texts: [string, string]; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; prompt?: string | undefined; } | { type: "NUMBER"; range: [number, number] | [number]; style: "SELECTION" | "INPUT"; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; } | { type: "TEXT"; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; } | { type: "STATUS"; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; } | { type: "REMINDER"; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; } | { type: "PLAYER_REMINDER"; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; } | { type: "SEAT_SIDE"; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; })[]; views: ({ source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "CHARACTER"; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "CHARACTER_KIND"; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "ALIGNMENT"; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "NUMBER"; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "PLAYER"; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "BOOLEAN"; texts: [string, string]; style: ("TEXT" | "ICON")[]; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "TEXT"; color: string; fontSize: number; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "STATUS"; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "REMINDER"; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "PLAYER_REMINDER"; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "SEAT_SIDE"; })[]; effects: ({ type: "ABILITY_CHANGE"; source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: string; }; target: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; }; } | { type: "ALIGNMENT_CHANGE"; source: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "CONSTANT"; value: "GOOD" | "EVIL"; }; target: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; }; } | { type: "CHARACTER_COUNT_CHANGE"; source?: { from: "CONSTANT"; value: { kind: "Townsfolk" | "Outsiders" | "Minions" | "Demons"; value: number; }; } | undefined; kind?: "Townsfolk" | "Outsiders" | "Minions" | "Demons" | undefined; value?: number | undefined; } | { type: "CHARACTER_CHANGE"; source: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "CONSTANT"; value: string; }; target: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; }; } | { type: "PERCEIVED_CHARACTER_CHANGE"; source: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "CONSTANT"; value: string; }; target: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; }; followPriority?: boolean | undefined; } | { type: "STATUS_CHANGE"; source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: "DEAD" | "ALIVE"; }; target: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; }; } | { type: "SEAT_CHANGE"; source: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "CONSTANT"; value: number; }; target: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; }; } | { type: "GAME_CHANGE"; source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: "GOOD" | "EVIL"; }; } | { type: "REMINDER_ADD"; source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: { mark: string; color?: string | undefined; description?: string | undefined; duration?: number | undefined; }; }; target: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; }; } | { type: "REMINDER_REMOVE"; source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: number; }; target: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; }; })[]; messages: { targets: ({ from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; })[]; content: ({ type: "PAYLOAD"; value: number | number[]; payloadType: "PLAYER"; options: { format: "NUMBER_AND_CHARACTER" | "NUMBER_ONLY" | "CHARACTER_ONLY" | "ALIGNMENT_ONLY"; }; } | { type: "PAYLOAD"; value: number | number[]; payloadType: "BOOLEAN"; options?: { texts?: [string, string] | undefined; style?: ("TEXT" | "ICON")[] | undefined; colors?: [(string | undefined)?, (string | undefined)?] | undefined; } | undefined; } | { type: "PAYLOAD"; value: number | number[]; payloadType: "CHARACTER_KIND" | "ALIGNMENT" | "CHARACTER" | "NUMBER" | "REMINDER" | "PLAYER_REMINDER" | "SEAT_SIDE" | "STATUS" | "TEXT"; options: Record<string, never>; } | { type: "TEXT"; value: string; } | { type: "EFFECTOR"; options: { format: "NUMBER_AND_CHARACTER" | "NUMBER_ONLY" | "CHARACTER_ONLY" | "ALIGNMENT_ONLY"; }; } | { type: "SPECIAL"; kind: "SPY"; })[]; }[]; scope: "EVERYONE" | "STORYTELLER_ONLY"; createdAt: string; bio?: string | undefined; tags?: string[] | null | undefined; }[];
1724
+ icon?:
1725
+ | string
1726
+ | undefined;
1727
+ skill?:
1728
+ | string
1729
+ | null
1730
+ | undefined;
1731
+ saying?:
1732
+ | string
1733
+ | null
1734
+ | undefined;
1735
+ tags?:
1736
+ | string[]
1737
+ | null
1738
+ | undefined;
1739
+ };
1740
+
1741
+ export type TAbility =
1742
+ {
1743
+ id: string;
1744
+ name: string;
1745
+ description: string;
1746
+ stage:
1747
+ | "PREPARE"
1748
+ | "CHARACTER_SELECTION"
1749
+ | "PLAYING";
1750
+ category:
1751
+ | "CHARACTER"
1752
+ | "STORYTELLER";
1753
+ executionTiming:
1754
+ | "NORMAL"
1755
+ | "DEFER_TO_END";
1756
+ inputs: ({ type: "PLAYER"; layout: "ROUND" | "ROW"; kinds: ("Townsfolk" | "Outsiders" | "Minions" | "Demons")[]; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; filterToken?: string | undefined; range?: [number, number] | [number] | undefined; } | { type: "CHARACTER"; kinds: ("Townsfolk" | "Outsiders" | "Minions" | "Demons")[]; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; filterToken?: string | undefined; range?: [number, number] | [number] | undefined; } | { type: "ALIGNMENT"; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; } | { type: "CHARACTER_KIND"; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; } | { type: "BOOLEAN"; style: "RADIO" | "SWITCH"; defaultValue: boolean; texts: [string, string]; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; prompt?: string | undefined; } | { type: "NUMBER"; range: [number, number] | [number]; style: "SELECTION" | "INPUT"; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; } | { type: "TEXT"; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; } | { type: "STATUS"; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; } | { type: "REMINDER"; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; } | { type: "PLAYER_REMINDER"; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; } | { type: "SEAT_SIDE"; title?: string | undefined; footer?: string | undefined; readonly?: boolean | undefined; })[];
1757
+ views: ({ source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "CHARACTER"; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "CHARACTER_KIND"; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "ALIGNMENT"; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "NUMBER"; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "PLAYER"; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "BOOLEAN"; texts: [string, string]; style: ("TEXT" | "ICON")[]; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "TEXT"; color: string; fontSize: number; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "STATUS"; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "REMINDER"; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "PLAYER_REMINDER"; } | { source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: any; }; type: "SEAT_SIDE"; })[];
1758
+ effects: ({ type: "ABILITY_CHANGE"; source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: string; }; target: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; }; } | { type: "ALIGNMENT_CHANGE"; source: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "CONSTANT"; value: "GOOD" | "EVIL"; }; target: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; }; } | { type: "CHARACTER_COUNT_CHANGE"; source?: { from: "CONSTANT"; value: { kind: "Townsfolk" | "Outsiders" | "Minions" | "Demons"; value: number; }; } | undefined; kind?: "Townsfolk" | "Outsiders" | "Minions" | "Demons" | undefined; value?: number | undefined; } | { type: "CHARACTER_CHANGE"; source: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "CONSTANT"; value: string; }; target: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; }; } | { type: "PERCEIVED_CHARACTER_CHANGE"; source: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "CONSTANT"; value: string; }; target: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; }; followPriority?: boolean | undefined; } | { type: "STATUS_CHANGE"; source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: "DEAD" | "ALIVE"; }; target: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; }; } | { type: "SEAT_CHANGE"; source: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "CONSTANT"; value: number; }; target: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; }; } | { type: "GAME_CHANGE"; source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: "GOOD" | "EVIL"; }; } | { type: "REMINDER_ADD"; source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: { mark: string; color?: string | undefined; description?: string | undefined; duration?: number | undefined; }; }; target: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; }; } | { type: "REMINDER_REMOVE"; source: { from: "PAYLOAD"; value: number | number[]; } | { from: "CONSTANT"; value: number; }; target: { from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; }; })[];
1759
+ messages: { targets: ({ from: "PAYLOAD"; value: number | number[]; } | { from: "EFFECTOR"; } | { from: "DYNAMIC"; anchor?: { from: "EFFECTOR"; } | { from: "PAYLOAD"; value: number | number[]; } | { from: "STATIC"; value: number; } | undefined; selector?: { scope: "BOTH_SIDES" | "LEFT_SIDE" | "RIGHT_SIDE" | { from: "PAYLOAD"; value: number | number[]; }; } | undefined; where?: { mode: "ALL" | "ANY"; conditions: { field: "CHARACTER_KIND" | "IS_DEAD" | "SEAT"; operator: "EQ" | "IN"; value: string | number | boolean | number[] | { from: "PAYLOAD"; value: number | number[]; } | string[]; }[]; } | undefined; limit?: number | { from: "PAYLOAD"; value: number | number[]; } | undefined; } | { from: "CUSTOM"; value: any; })[]; content: ({ type: "PAYLOAD"; value: number | number[]; payloadType: "PLAYER"; options: { format: "NUMBER_AND_CHARACTER" | "NUMBER_ONLY" | "CHARACTER_ONLY" | "ALIGNMENT_ONLY"; }; } | { type: "PAYLOAD"; value: number | number[]; payloadType: "BOOLEAN"; options?: { texts?: [string, string] | undefined; style?: ("TEXT" | "ICON")[] | undefined; colors?: [(string | undefined)?, (string | undefined)?] | undefined; } | undefined; } | { type: "PAYLOAD"; value: number | number[]; payloadType: "CHARACTER_KIND" | "ALIGNMENT" | "CHARACTER" | "NUMBER" | "REMINDER" | "PLAYER_REMINDER" | "SEAT_SIDE" | "STATUS" | "TEXT"; options: Record<string, never>; } | { type: "TEXT"; value: string; } | { type: "EFFECTOR"; options: { format: "NUMBER_AND_CHARACTER" | "NUMBER_ONLY" | "CHARACTER_ONLY" | "ALIGNMENT_ONLY"; }; } | { type: "SPECIAL"; kind: "SPY"; })[]; }[];
1760
+ scope:
1761
+ | "EVERYONE"
1762
+ | "STORYTELLER_ONLY";
1763
+ createdAt: string;
1764
+ bio?:
1765
+ | string
1766
+ | undefined;
1767
+ tags?:
1768
+ | string[]
1769
+ | null
1770
+ | undefined;
1771
+ };
1772
+
1773
+ export type TAbilityExecutionTiming =
1774
+ | "NORMAL"
1775
+ | "DEFER_TO_END";