@jjlmoya/utils-tabletop 1.9.0 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/package.json +1 -1
  2. package/src/entries.ts +4 -0
  3. package/src/tests/locale_completeness.test.ts +1 -1
  4. package/src/tests/tool_validation.test.ts +1 -1
  5. package/src/tool/decision-wheel/client.ts +5 -1
  6. package/src/tool/decision-wheel/components/SegmentEditor.astro +1 -1
  7. package/src/tool/decision-wheel/decision-wheel.css +23 -7
  8. package/src/tool/hidden-role-dealer/bibliography.astro +16 -0
  9. package/src/tool/hidden-role-dealer/bibliography.ts +12 -0
  10. package/src/tool/hidden-role-dealer/client.ts +265 -0
  11. package/src/tool/hidden-role-dealer/component.astro +184 -0
  12. package/src/tool/hidden-role-dealer/entry.ts +145 -0
  13. package/src/tool/hidden-role-dealer/hidden-role-dealer.css +604 -0
  14. package/src/tool/hidden-role-dealer/i18n/de.ts +195 -0
  15. package/src/tool/hidden-role-dealer/i18n/en.ts +279 -0
  16. package/src/tool/hidden-role-dealer/i18n/es.ts +279 -0
  17. package/src/tool/hidden-role-dealer/i18n/fr.ts +215 -0
  18. package/src/tool/hidden-role-dealer/i18n/id.ts +191 -0
  19. package/src/tool/hidden-role-dealer/i18n/it.ts +191 -0
  20. package/src/tool/hidden-role-dealer/i18n/ja.ts +191 -0
  21. package/src/tool/hidden-role-dealer/i18n/ko.ts +191 -0
  22. package/src/tool/hidden-role-dealer/i18n/nl.ts +191 -0
  23. package/src/tool/hidden-role-dealer/i18n/pl.ts +191 -0
  24. package/src/tool/hidden-role-dealer/i18n/pt.ts +191 -0
  25. package/src/tool/hidden-role-dealer/i18n/ru.ts +191 -0
  26. package/src/tool/hidden-role-dealer/i18n/sv.ts +191 -0
  27. package/src/tool/hidden-role-dealer/i18n/tr.ts +191 -0
  28. package/src/tool/hidden-role-dealer/i18n/zh.ts +191 -0
  29. package/src/tool/hidden-role-dealer/index.ts +10 -0
  30. package/src/tool/hidden-role-dealer/logic.test.ts +99 -0
  31. package/src/tool/hidden-role-dealer/logic.ts +134 -0
  32. package/src/tool/hidden-role-dealer/modules/custom-role-manager.ts +35 -0
  33. package/src/tool/hidden-role-dealer/modules/dealer-logic.ts +73 -0
  34. package/src/tool/hidden-role-dealer/modules/hold-controller.ts +38 -0
  35. package/src/tool/hidden-role-dealer/modules/particle-effects.ts +40 -0
  36. package/src/tool/hidden-role-dealer/modules/player-manager.ts +44 -0
  37. package/src/tool/hidden-role-dealer/modules/presets.ts +46 -0
  38. package/src/tool/hidden-role-dealer/modules/setup-handlers.ts +34 -0
  39. package/src/tool/hidden-role-dealer/modules/storage.ts +23 -0
  40. package/src/tool/hidden-role-dealer/modules/utils.ts +18 -0
  41. package/src/tool/hidden-role-dealer/modules/wizard-html.ts +161 -0
  42. package/src/tool/hidden-role-dealer/modules/wizard-renderer.ts +161 -0
  43. package/src/tool/hidden-role-dealer/modules/writer-handler.ts +70 -0
  44. package/src/tool/hidden-role-dealer/seo.astro +16 -0
  45. package/src/tool/hidden-role-dealer/types.ts +31 -0
  46. package/src/tools.ts +2 -0
@@ -0,0 +1,70 @@
1
+ import { assignRoles, generateImpostorRoles, calculateImpostorCount, getRandomSecretWord } from '../logic';
2
+ import type { ImpostorValues } from '../types';
3
+ import type { PlayerManager } from './player-manager';
4
+
5
+ export interface PreroundOptions {
6
+ secret: string;
7
+ preroundWords: string[];
8
+ preroundStep: number;
9
+ playerMgr: PlayerManager;
10
+ vals: ImpostorValues;
11
+ mode: string;
12
+ ui: Record<string, string>;
13
+ }
14
+
15
+ export interface PreroundResult {
16
+ preroundWords: string[];
17
+ preroundStep: number;
18
+ preroundActive: boolean;
19
+ impostorSecret: string;
20
+ finished: boolean;
21
+ }
22
+
23
+ function completePreround(options: PreroundOptions, words: string[]): string {
24
+ const secretWord = words[Math.floor(Math.random() * words.length)];
25
+ const players = options.playerMgr.getPlayers();
26
+ const impCount = calculateImpostorCount(options.mode, players.length, options.vals);
27
+ const nextPlayers = assignRoles(players, generateImpostorRoles(players.length, impCount, secretWord, options.ui));
28
+ options.playerMgr.setPlayers(nextPlayers);
29
+ return secretWord;
30
+ }
31
+
32
+ export function savePreroundWord(options: PreroundOptions): PreroundResult {
33
+ const nextWords = [...options.preroundWords, options.secret];
34
+ const nextStep = options.preroundStep + 1;
35
+ const totalPlayers = options.playerMgr.getPlayers().length;
36
+ if (nextStep < totalPlayers) {
37
+ return {
38
+ preroundWords: nextWords,
39
+ preroundStep: nextStep,
40
+ preroundActive: true,
41
+ impostorSecret: '',
42
+ finished: false
43
+ };
44
+ }
45
+ const secretWord = completePreround(options, nextWords);
46
+ return {
47
+ preroundWords: nextWords,
48
+ preroundStep: nextStep,
49
+ preroundActive: false,
50
+ impostorSecret: secretWord,
51
+ finished: true
52
+ };
53
+ }
54
+
55
+ export function saveWriterWord(
56
+ secret: string,
57
+ playerMgr: PlayerManager,
58
+ ui: Record<string, string>
59
+ ): string {
60
+ const actualSecret = secret.trim() || getRandomSecretWord();
61
+ const prefix = ui.roleCrewmateSecret || 'The Secret Word is:';
62
+ const players = playerMgr.getPlayers();
63
+ players.forEach(p => {
64
+ if (p.role && (p.role.id.startsWith('crew-') || p.role.id === 'writer')) {
65
+ p.role.secretInfo = `${prefix} ${actualSecret}`;
66
+ }
67
+ });
68
+ playerMgr.setPlayers(players);
69
+ return actualSecret;
70
+ }
@@ -0,0 +1,16 @@
1
+ ---
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { hiddenRoleDealer } from './index';
4
+ import type { KnownLocale } from '../../types';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'en' } = Astro.props;
11
+ const loader = hiddenRoleDealer.i18n[locale] || hiddenRoleDealer.i18n.en;
12
+ const content = await loader?.();
13
+ if (!content) return null;
14
+ ---
15
+
16
+ {content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
@@ -0,0 +1,31 @@
1
+ export interface Role {
2
+ id: string;
3
+ name: string;
4
+ description: string;
5
+ team: string;
6
+ secretInfo: string;
7
+ alignment: 'good' | 'evil' | 'neutral';
8
+ quantity?: number | 'remaining';
9
+ }
10
+
11
+ export interface Player {
12
+ id: string;
13
+ name: string;
14
+ role: Role | null;
15
+ revealed: boolean;
16
+ }
17
+
18
+ export interface GamePreset {
19
+ id: string;
20
+ name: string;
21
+ roles: Role[];
22
+ }
23
+
24
+ export type DealerState = 'setup' | 'distributing' | 'revealed' | 'complete';
25
+
26
+ export interface ImpostorValues {
27
+ fixedVal: number;
28
+ percentVal: number;
29
+ minVal: number;
30
+ maxVal: number;
31
+ }
package/src/tools.ts CHANGED
@@ -9,6 +9,7 @@ import { FANTASY_RUNES_TRANSLATOR_TOOL } from './tool/fantasy-runes-translator';
9
9
  import { DECISION_WHEEL_TOOL } from './tool/decision-wheel';
10
10
  import { INVESTIGATION_BOARD_TOOL } from './tool/investigation-board';
11
11
  import { LUNAR_TIDE_TRACKER_TOOL } from './tool/lunar-tide-tracker';
12
+ import { HIDDEN_ROLE_DEALER_TOOL } from './tool/hidden-role-dealer';
12
13
 
13
14
  export const ALL_TOOLS: ToolDefinition[] = [
14
15
  DICE_ROLLER_SIMULATOR_TOOL,
@@ -20,5 +21,6 @@ export const ALL_TOOLS: ToolDefinition[] = [
20
21
  DECISION_WHEEL_TOOL,
21
22
  INVESTIGATION_BOARD_TOOL,
22
23
  LUNAR_TIDE_TRACKER_TOOL,
24
+ HIDDEN_ROLE_DEALER_TOOL,
23
25
  ];
24
26