@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,195 @@
1
+ import { bibliography } from '../bibliography';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { HiddenRoleDealerUI } from '../entry';
4
+
5
+ const ui: HiddenRoleDealerUI = {
6
+ title: 'Verdeckte Rollenverteilung',
7
+ setupTitle: 'Konfiguration der Rollenverteilung',
8
+ playerList: 'Spielerliste',
9
+ addPlayer: 'Hinzufügen',
10
+ addPlayerPlaceholder: 'Spielername...',
11
+ rolePool: 'Geheimer Rollenpool',
12
+ presetsTitle: 'Spielvorlagen',
13
+ presetCustom: 'Benutzerdefiniertes Setup',
14
+ dealRoles: 'Geheime Rollen verteilen',
15
+ clearPlayers: 'Alle löschen',
16
+ instructions: 'Geben Sie die Spielernamen ein, konfigurieren Sie die geheimen Rollen und tippen Sie auf Geheime Rollen verteilen.',
17
+ passTo: 'Geben Sie das Gerät an',
18
+ holdToReveal: 'Gedrückt halten zum Offenbaren',
19
+ releasingResets: 'Weiter gedrückt halten zum Offenbaren...',
20
+ hideRole: 'Verstanden, Rolle ausblenden',
21
+ nextPlayer: 'Nächster Spieler',
22
+ finishedTitle: 'Alle Rollen verteilt',
23
+ finishedDesc: 'Alle Spieler haben ihre Rollen heimlich eingesehen. Sie können das Spiel jetzt starten.',
24
+ restart: 'Neustarten und neu verteilen',
25
+ rolesCount: 'Rollen ausgewählt',
26
+ playersCount: 'Spieler hinzugefügt',
27
+ mismatchWarning: 'Mindestens 3 Spieler sind erforderlich, um Rollen zu verteilen.',
28
+ werewolfName: 'Werwolf / Mafia',
29
+ werewolfDesc: 'Dorfbewohner versuchen, die versteckten Werwölfe zu finden und abzuwählen.',
30
+ avalonName: 'The Resistance: Avalon',
31
+ avalonDesc: 'Merlin und treue Diener erfüllen Quests, während sie Saboteure meiden.',
32
+ hitlerName: 'Secret Hitler',
33
+ hitlerDesc: 'Liberale versuchen, Gesetze zu verabschieden und den geheimen Anführer zu finden.',
34
+ customName: 'Benutzerdefiniertes Setup',
35
+ customDesc: 'Verteilen Sie einfache beschriftete Karten an die Spieler.',
36
+ roleWerewolfName: 'Werwolf',
37
+ roleWerewolfDesc: 'Eliminieren Sie nachts heimlich Dorfbewohner.',
38
+ roleWerewolfSecret: 'Arbeiten Sie mit anderen Werwölfen zusammen, um das Dorf zu täuschen.',
39
+ roleSeerName: 'Seherin',
40
+ roleSeerDesc: 'Überprüfen Sie jede Nacht die Gesinnung eines Spielers.',
41
+ roleSeerSecret: 'Identifizieren Sie Werwölfe, aber bleiben Sie verborgen, um zu überleben.',
42
+ roleDoctorName: 'Arzt',
43
+ roleDoctorDesc: 'Schützen Sie jede Nacht einen Spieler vor der Eliminierung.',
44
+ roleDoctorSecret: 'Halten Sie wichtige Dorfbewohner am Leben.',
45
+ roleVillagerName: 'Dorfbewohner',
46
+ roleVillagerDesc: 'Finden Sie die versteckten Werwölfe.',
47
+ roleVillagerSecret: 'Diskutieren, analysieren und wählen Sie verdächtige Spieler ab.',
48
+ roleMerlinName: 'Merlin',
49
+ roleMerlinDesc: 'Kennt die Agenten des Bösen.',
50
+ roleMerlinSecret: 'Führen Sie das Team zum Sieg, ohne sich zu offenbaren.',
51
+ roleAssassinName: 'Meuchelmörder',
52
+ roleAssassinDesc: 'Kann Merlin am Spielende ermorden.',
53
+ roleAssassinSecret: 'Finden Sie Merlin, um am Ende den Sieg zu stehlen.',
54
+ roleMinionName: 'Minion von Mordred',
55
+ roleMinionDesc: 'Informierter Agent von Mordred.',
56
+ roleMinionSecret: 'Sabotieren Sie Quests, ohne entdeckt zu werden.',
57
+ roleServantName: 'Treuer Diener',
58
+ roleServantDesc: 'Erfüllen Sie Quests für Artus.',
59
+ roleServantSecret: 'Diskutieren Sie, schlagen Sie Teams vor und wählen Sie logisch.',
60
+ roleHitlerName: 'Hitler',
61
+ roleHitlerDesc: 'Der geheime Anführer der Faschisten.',
62
+ roleHitlerSecret: 'Lassen Sie sich zum Kanzler wählen oder verabschieden Sie faschistische Gesetze.',
63
+ roleFascistName: 'Faschist',
64
+ roleFascistDesc: 'Koordinieren Sie sich, um faschistische Gesetze zu verabschieden.',
65
+ roleFascistSecret: 'Schützen Sie Hitler und manipulieren Sie die Wahlergebnisse.',
66
+ roleLiberalName: 'Liberaler',
67
+ roleLiberalDesc: 'Finden und stoppen Sie die faschistische Bedrohung.',
68
+ roleLiberalSecret: 'Verabschieden Sie liberale Gesetze und eliminieren Sie Hitler falls möglich.',
69
+ roleCustomName: 'Benutzerdefinierte Rolle',
70
+ roleCustomDesc: 'Allgemeine Beschreibung der benutzerdefinierten Rolle.',
71
+ roleCustomSecret: 'Erfüllen Sie Ihr Teamziel.',
72
+ teamWerewolves: 'Werwölfe',
73
+ teamVillagers: 'Dorfbewohner',
74
+ teamGood: 'Gut',
75
+ teamEvil: 'Böse',
76
+ teamFascist: 'Faschistisch',
77
+ teamLiberal: 'Liberal',
78
+ teamCustom: 'Benutzerdefiniertes Team',
79
+ secretRoleIs: 'Deine geheime Rolle ist:',
80
+ customRolesTitle: 'Einrichtung benutzerdefinierter Rollen',
81
+ customRolePlaceholder: 'Rollenname eingeben...',
82
+ neutralLabel: 'Neutral',
83
+ goodLabel: 'Gut',
84
+ evilLabel: 'Böse',
85
+ customMismatchWarning: 'Konfigurieren Sie genau so viele benutzerdefinierte Rollen wie Spieler.',
86
+ impostorPresetName: 'Impostor-Spiel',
87
+ impostorPresetDesc: 'Teilen Sie Impostoren und Crewmates mit anpassbaren Anzahlen zu.',
88
+ impostorTitle: 'Impostor-Einstellungen',
89
+ impostorWarning: 'Sie benötigen mehr Spieler als Impostoren.',
90
+ roleImpostorName: 'Impostor',
91
+ roleImpostorDesc: 'Eliminieren Sie heimlich Crewmates.',
92
+ roleImpostorSecret: 'Sabotieren und eliminieren Sie, ohne erwischt zu werden.',
93
+ roleCrewmateName: 'Crewmate',
94
+ roleCrewmateDesc: 'Erfüllen Sie Aufgaben und finden Sie den Impostor.',
95
+ roleCrewmateSecret: 'Das geheime Wort ist:',
96
+ teamImpostor: 'Impostor',
97
+ teamCrewmate: 'Crewmate',
98
+ impostorSharedSecretLabel: 'Gemeinsames geheimes Wort',
99
+ impostorSharedSecretPlaceholder: 'z. B. Ort: Restaurant, oder Wort: Apfel',
100
+ impostorModeLabel: 'Impostor-Berechnungsmodus',
101
+ impostorModeFixed: 'Feste Anzahl',
102
+ impostorModePercentage: 'Prozentsatz',
103
+ impostorModeRange: 'Zufälliger Bereich',
104
+ impostorFixedLabel: 'Anzahl der Impostoren',
105
+ impostorPercentageLabel: 'Impostor-Prozentsatz (%)',
106
+ impostorRangeMinLabel: 'Minimale Impostoren',
107
+ impostorRangeMaxLabel: 'Maximale Impostoren',
108
+ impostorWriterLabel: 'Wortschreiber / Host',
109
+ impostorWriterRandom: 'Nicht-Spieler-Host',
110
+ roleWriterName: 'Schreiber',
111
+ roleWriterDesc: 'Sie bestimmen das geheime Wort.',
112
+ writerInputPrompt: 'Sie sind der Schreiber. Geben Sie das geheime Wort oder den Ort für dieses Spiel ein:',
113
+ writerInputPlaceholder: 'z. B. Restaurant, Krankenhaus...',
114
+ btnSetWord: 'Wort speichern & Start',
115
+ impostorWriterPreround: 'Geheime Vorrunde (Alle Spieler)',
116
+ impostorWriterDescHost: 'Der Nicht-Spieler-Host verwendet ein zufälliges oder voreingestelltes Wort.',
117
+ impostorWriterDescPreround: 'Die Vorrunde lässt alle Spieler Wörter heimlich aufschreiben und wählt eines zufällig aus.',
118
+ impostorWriterDescPlayer: 'Der ausgewählte Spieler schreibt das Wort und kann kein Impostor sein.',
119
+ preroundPassTitle: 'Vorrunde: Geben Sie das Gerät an',
120
+ preroundInputPrompt: 'Schreiben Sie heimlich ein Wort oder einen Ort:',
121
+ preroundPassHint: 'Halten Sie das Wort vor anderen Spielern geheim!',
122
+ btnSubmitWord: 'Wort absenden',
123
+ };
124
+
125
+ const faq = [
126
+ {
127
+ question: 'Wie funktioniert die Verdeckte Rollenverteilung?',
128
+ answer: 'Das Tool ermöglicht es Ihnen, geheime Rollen für Social-Deduction-Spiele lokal auf einem einzigen Gerät zu verteilen. Sie geben die Spielernamen ein, wählen eine Spielvorlage oder passen die Rollen an und reichen das Gerät dann von Spieler zu Spieler weiter. Jeder Spieler hält einen sicheren Reveal-Button gedrückt, um seine Rolle privat einzusehen.',
129
+ },
130
+ {
131
+ question: 'Was ist der Zweck des Gedrückthaltens beim Offenbaren?',
132
+ answer: 'Um zu verhindern, dass Spieler versehentlich die Rollen anderer sehen, muss der Reveal-Button gedrückt gehalten werden. Sobald er losgelassen wird, blendet sich die Rolle sofort wieder aus.',
133
+ },
134
+ ];
135
+
136
+ const howTo = [
137
+ {
138
+ name: 'Spieler hinzufügen',
139
+ text: 'Geben Sie die Namen der Spieler in das Konfigurationsfenster ein.',
140
+ },
141
+ {
142
+ name: 'Vorlage wählen',
143
+ text: 'Wählen Sie eine der voreingestellten Rollenpools oder erstellen Sie eine eigene Konfiguration.',
144
+ },
145
+ {
146
+ name: 'Weitergeben und Offenbaren',
147
+ text: 'Geben Sie das Gerät weiter. Jeder Spieler hält die Taste gedrückt, um seine Rolle heimlich zu sehen, und blendet sie wieder aus.',
148
+ },
149
+ ];
150
+
151
+ export const content: ToolLocaleContent<HiddenRoleDealerUI> = {
152
+ slug: 'verdeckte-rollenverteilung-geheim',
153
+ title: 'Verdeckte Rollenverteilung: Geheime Identitäten & Rollenverteiler',
154
+ description: 'Verteilen Sie geheime Rollen lokal für Social-Deduction-Spiele wie Werwolf, Avalon, Secret Hitler und Impostor ohne physische Karten.',
155
+ ui,
156
+ seo: [
157
+ { type: 'title', text: 'Teambalance in Social-Deduction-Spielen', level: 2 },
158
+ { type: 'paragraph', html: 'Die größte Herausforderung bei Werwolf, Avalon oder Secret Hitler besteht darin, das Verhältnis von guten und bösen Rollen basierend auf der Spieleranzahl auszubalancieren. Ein falsches Verhältnis kann das Spiel für eine Seite zu einfach und für die andere frustrierend machen. Durch die Verwendung von empfohlenen Community-Ratios stellen Sie eine faire Spielrunde sicher.' },
159
+ ],
160
+ faq,
161
+ bibliography,
162
+ howTo,
163
+ schemas: [
164
+ {
165
+ '@context': 'https://schema.org',
166
+ '@type': 'FAQPage',
167
+ 'mainEntity': faq.map((f) => ({
168
+ '@type': 'Question',
169
+ 'name': f.question,
170
+ 'acceptedAnswer': {
171
+ '@type': 'Answer',
172
+ 'text': f.answer,
173
+ },
174
+ })),
175
+ },
176
+ {
177
+ '@context': 'https://schema.org',
178
+ '@type': 'SoftwareApplication',
179
+ 'name': ui.title,
180
+ 'operatingSystem': 'All',
181
+ 'applicationCategory': 'UtilitiesApplication',
182
+ 'browserRequirements': 'Requires HTML5. Requires JavaScript.',
183
+ },
184
+ {
185
+ '@context': 'https://schema.org',
186
+ '@type': 'HowTo',
187
+ 'name': ui.setupTitle,
188
+ 'step': howTo.map((h) => ({
189
+ '@type': 'HowToStep',
190
+ 'name': h.name,
191
+ 'text': h.text,
192
+ })),
193
+ },
194
+ ],
195
+ };
@@ -0,0 +1,279 @@
1
+ import { bibliography } from '../bibliography';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { HiddenRoleDealerUI } from '../entry';
4
+
5
+ const ui: HiddenRoleDealerUI = {
6
+ title: 'Hidden Role Dealer',
7
+ setupTitle: 'Role Distribution Setup',
8
+ playerList: 'Players List',
9
+ addPlayer: 'Add',
10
+ addPlayerPlaceholder: 'Enter player name...',
11
+ rolePool: 'Secret Roles Pool',
12
+ presetsTitle: 'Game Presets',
13
+ presetCustom: 'Custom Setup',
14
+ dealRoles: 'Deal Secret Roles',
15
+ clearPlayers: 'Clear All',
16
+ instructions: 'Enter player names, configure the secret roles, then tap Deal Secret Roles.',
17
+ passTo: 'Pass the device to',
18
+ holdToReveal: 'Hold to Reveal',
19
+ releasingResets: 'Keep holding to reveal...',
20
+ hideRole: 'Got it, hide role',
21
+ nextPlayer: 'Next Player',
22
+ finishedTitle: 'All Roles Dealt',
23
+ finishedDesc: 'All players have secretly viewed their roles. You can now start the game.',
24
+ restart: 'Restart and Redeal',
25
+ rolesCount: 'Roles Selected',
26
+ playersCount: 'Players Added',
27
+ mismatchWarning: 'Minimum 3 players required to deal roles.',
28
+ werewolfName: 'Werewolf / Mafia',
29
+ werewolfDesc: 'Villagers try to find and vote out hidden Werewolves.',
30
+ avalonName: 'The Resistance: Avalon',
31
+ avalonDesc: 'Merlin and loyal servants complete quests while avoiding saboteurs.',
32
+ hitlerName: 'Secret Hitler',
33
+ hitlerDesc: 'Liberals try to pass laws and find the secret leader.',
34
+ customName: 'Custom Setup',
35
+ customDesc: 'Distribute simple labeled cards to players.',
36
+ roleWerewolfName: 'Werewolf',
37
+ roleWerewolfDesc: 'Secretly eliminate Villagers at night.',
38
+ roleWerewolfSecret: 'Work with other Werewolves to deceive the town.',
39
+ roleSeerName: 'Seer',
40
+ roleSeerDesc: 'Check a player\'s alignment each night.',
41
+ roleSeerSecret: 'Identify Werewolves but stay hidden to survive.',
42
+ roleDoctorName: 'Doctor',
43
+ roleDoctorDesc: 'Protect a player from elimination each night.',
44
+ roleDoctorSecret: 'Keep key town members safe.',
45
+ roleVillagerName: 'Villager',
46
+ roleVillagerDesc: 'Find the hidden Werewolves.',
47
+ roleVillagerSecret: 'Discuss, analyze, and vote out suspicious players.',
48
+ roleMerlinName: 'Merlin',
49
+ roleMerlinDesc: 'Knows the agents of evil.',
50
+ roleMerlinSecret: 'Guide the team to success without revealing yourself.',
51
+ roleAssassinName: 'Assassin',
52
+ roleAssassinDesc: 'Can assassinate Merlin at the game end.',
53
+ roleAssassinSecret: 'Find Merlin to steal victory at the end.',
54
+ roleMinionName: 'Minion of Mordred',
55
+ roleMinionDesc: 'Informed agent of Mordred.',
56
+ roleMinionSecret: 'Sabotage quests while remaining undetected.',
57
+ roleServantName: 'Loyal Servant',
58
+ roleServantDesc: 'Complete quests for Arthur.',
59
+ roleServantSecret: 'Discuss, propose teams, and vote logically.',
60
+ roleHitlerName: 'Hitler',
61
+ roleHitlerDesc: 'The secret leader of the Fascists.',
62
+ roleHitlerSecret: 'Get elected Chancellor or let Fascists enact laws.',
63
+ roleFascistName: 'Fascist',
64
+ roleFascistDesc: 'Coordinate to enact Fascist laws.',
65
+ roleFascistSecret: 'Protect Hitler and manipulate election results.',
66
+ roleLiberalName: 'Liberal',
67
+ roleLiberalDesc: 'Find and stop the Fascist threat.',
68
+ roleLiberalSecret: 'Enact Liberal laws and execute Hitler if possible.',
69
+ roleCustomName: 'Custom Role',
70
+ roleCustomDesc: 'Generic custom role description.',
71
+ roleCustomSecret: 'Fulfill your team objective.',
72
+ teamWerewolves: 'Werewolves',
73
+ teamVillagers: 'Villagers',
74
+ teamGood: 'Good',
75
+ teamEvil: 'Evil',
76
+ teamFascist: 'Fascist',
77
+ teamLiberal: 'Liberal',
78
+ teamCustom: 'Team Custom',
79
+ secretRoleIs: 'your secret role is:',
80
+ customRolesTitle: 'Custom Roles Setup',
81
+ customRolePlaceholder: 'Enter role name...',
82
+ neutralLabel: 'Neutral',
83
+ goodLabel: 'Good',
84
+ evilLabel: 'Evil',
85
+ customMismatchWarning: 'Configure exactly the same number of custom roles as players.',
86
+ impostorPresetName: 'Impostor Game',
87
+ impostorPresetDesc: 'Assign Impostors and Crewmates with customizable counts.',
88
+ impostorTitle: 'Impostor Settings',
89
+ impostorWarning: 'Need more players than impostors.',
90
+ roleImpostorName: 'Impostor',
91
+ roleImpostorDesc: 'Secretly eliminate Crewmates.',
92
+ roleImpostorSecret: 'Sabotage and eliminate without getting caught.',
93
+ roleCrewmateName: 'Crewmate',
94
+ roleCrewmateDesc: 'Complete tasks and find the Impostor.',
95
+ roleCrewmateSecret: 'Observe player movements and vote out suspects.',
96
+ teamImpostor: 'Impostor',
97
+ teamCrewmate: 'Crewmate',
98
+ impostorSharedSecretLabel: 'Shared Secret Information',
99
+ impostorSharedSecretPlaceholder: 'e.g. Location: Restaurant, or Word: Apple',
100
+ impostorModeLabel: 'Impostor Calculation Mode',
101
+ impostorModeFixed: 'Fixed Count',
102
+ impostorModePercentage: 'Percentage',
103
+ impostorModeRange: 'Random Range',
104
+ impostorFixedLabel: 'Number of Impostors',
105
+ impostorPercentageLabel: 'Impostor Percentage (%)',
106
+ impostorRangeMinLabel: 'Minimum Impostors',
107
+ impostorRangeMaxLabel: 'Maximum Impostors',
108
+ impostorWriterLabel: 'Word Writer / Host',
109
+ impostorWriterRandom: 'Non-player host',
110
+ roleWriterName: 'Writer',
111
+ roleWriterDesc: 'You decide the secret word.',
112
+ writerInputPrompt: 'You are the Writer. Enter the secret word or location for this game:',
113
+ writerInputPlaceholder: 'e.g. Restaurant, Hospital...',
114
+ btnSetWord: 'Set Word & Start',
115
+ impostorWriterPreround: 'Secret Pre-round (All players)',
116
+ impostorWriterDescHost: 'Non-player host uses a random or preset word.',
117
+ impostorWriterDescPreround: 'Pre-round lets all players secretly write words, then picks one randomly.',
118
+ impostorWriterDescPlayer: 'Selected player writes the word and cannot be the impostor.',
119
+ preroundPassTitle: 'Pre-round: Pass the device to',
120
+ preroundInputPrompt: 'Secretly write a word or location:',
121
+ preroundPassHint: 'Keep it secret from other players!',
122
+ btnSubmitWord: 'Submit Word',
123
+ };
124
+
125
+ const faq = [
126
+ {
127
+ question: 'How does the Hidden Role Dealer work?',
128
+ answer: 'The Hidden Role Dealer allows you to assign secret roles for tabletop social deduction games locally on a single device. You enter player names, choose a role preset or customize roles, and then hand the device from player to player. Each player uses a secure reveal button to view their role in private before passing it on.',
129
+ },
130
+ {
131
+ question: 'What is the purpose of the Hold to Reveal action?',
132
+ answer: 'To prevent players from accidentally seeing each other\'s roles, the tool requires holding down the reveal button. If a player releases the button, the role is immediately hidden again.',
133
+ },
134
+ {
135
+ question: 'Are there presets for popular games?',
136
+ answer: 'Yes. The tool includes built-in presets for popular games like Werewolf, Avalon, and Secret Hitler, automatically adjusting the role pool based on your player count.',
137
+ },
138
+ {
139
+ question: 'Can I create a custom role setup?',
140
+ answer: 'Yes. You can select the custom preset and specify exactly which roles and teams you want to distribute to your players.',
141
+ },
142
+ ];
143
+
144
+ const howTo = [
145
+ {
146
+ name: 'Add Players',
147
+ text: 'Enter player names in the setup panel.',
148
+ },
149
+ {
150
+ name: 'Select Preset',
151
+ text: 'Choose one of the built-in game presets or set up a custom role pool.',
152
+ },
153
+ {
154
+ name: 'Pass and Reveal',
155
+ text: 'Pass the device to each player. Each player must press and hold the reveal button to view their secret role, then tap next.',
156
+ },
157
+ ];
158
+
159
+ export const content: ToolLocaleContent<HiddenRoleDealerUI> = {
160
+ slug: 'hidden-role-dealer',
161
+ title: 'Hidden Role Dealer: Secret Role Distributor',
162
+ description: 'Distribute secret roles locally for social deduction games like Werewolf, Avalon, and Secret Hitler.',
163
+ ui,
164
+ seo: [
165
+ { type: 'title', text: 'Balancing Teams in Social Deduction Games', level: 2 },
166
+ { type: 'paragraph', html: 'A central challenge of playing Werewolf, Avalon, or Secret Hitler is balancing the number of good and evil roles based on the total player count. An incorrect ratio can make the game too easy for one team and frustrating for the other. By referencing mathematical probabilities and standard community configurations, you can ensure a balanced play session.' },
167
+ {
168
+ type: 'table',
169
+ headers: ['Total Players', 'Good Team Count', 'Evil Team Count', 'Recommended Game Presets'],
170
+ rows: [
171
+ ['5 Players', '3 Good (or Liberals)', '2 Evil (or Fascists)', 'Avalon or Secret Hitler'],
172
+ ['6 Players', '4 Good (or Liberals)', '2 Evil (or Fascists)', 'Avalon or Secret Hitler'],
173
+ ['7 Players', '5 Good (or Liberals)', '2 Evil (or Fascists / Hitler)', 'Werewolf, Avalon, or Secret Hitler'],
174
+ ['8 Players', '5 Good (or Liberals)', '3 Evil (or Fascists / Hitler)', 'Werewolf, Avalon, or Secret Hitler'],
175
+ ['9 Players', '6 Good (or Liberals)', '3 Evil (or Fascists / Hitler)', 'Werewolf, Avalon, or Secret Hitler'],
176
+ ['10 Players', '6 Good (or Liberals)', '4 Evil (or Fascists / Hitler)', 'Werewolf, Avalon, or Secret Hitler'],
177
+ ],
178
+ },
179
+ { type: 'title', text: 'Configuring Spyfall and Impostor Games without a Host', level: 2 },
180
+ { type: 'paragraph', html: 'To run word association games like Spyfall or Impostor smoothly on one screen, role distribution must remain unbiased. If a player acts as a designated Host, they enter the word and are automatically forced to be a Crewmate. Alternatively, selecting a Non-Player Host lets the app auto-assign pre-configured locations. For absolute uncertainty, the Secret Pre-round selects three players anonymously to input words, choosing one randomly so everyone can play with zero prior knowledge.' },
181
+ { type: 'title', text: 'Host Best Practices for Mobile Pass and Play', level: 2 },
182
+ { type: 'paragraph', html: 'Using a single shared screen to distribute hidden roles is convenient but prone to leaks. To maintain absolute secrecy, the game host should enforce these steps: pass the device in a consistent direction around the table, have players adjust the screen angle so neighbors cannot peek, and instruct players to release the hold-to-reveal button immediately if someone looks their way.' },
183
+ {
184
+ type: 'comparative',
185
+ items: [
186
+ {
187
+ title: 'Werewolf / Mafia',
188
+ description: 'Requires a narrator to moderate night rounds. High player counts are optimal to build suspense and confusion.',
189
+ icon: 'mdi:ghost',
190
+ highlight: false,
191
+ points: [
192
+ 'Narrator facilitated play',
193
+ 'Player elimination mechanic',
194
+ 'Ideal for large parties',
195
+ ],
196
+ },
197
+ {
198
+ title: 'The Resistance / Avalon',
199
+ description: 'No player elimination. Players debate on missions, making logic and voting patterns critical.',
200
+ icon: 'mdi:shield-outline',
201
+ highlight: true,
202
+ points: [
203
+ 'Zero player elimination',
204
+ 'Mission-based voting loop',
205
+ 'High strategic depth',
206
+ ],
207
+ },
208
+ {
209
+ title: 'Secret Hitler',
210
+ description: 'Uses election mechanics and policy draws to create mechanical doubt and fast-paced debate.',
211
+ icon: 'mdi:incognito',
212
+ highlight: false,
213
+ points: [
214
+ 'Policy draw uncertainty',
215
+ 'Presidential election loop',
216
+ 'Fast-paced group discussions',
217
+ ],
218
+ },
219
+ ],
220
+ columns: 3,
221
+ },
222
+ {
223
+ type: 'glossary',
224
+ items: [
225
+ {
226
+ term: 'Social Deduction',
227
+ definition: 'A genre of tabletop games where players attempt to uncover each other\'s hidden allegiances.',
228
+ },
229
+ {
230
+ term: 'Moderator / Narrator',
231
+ definition: 'A non-playing facilitator who manages game phases, player actions, and night actions.',
232
+ },
233
+ {
234
+ term: 'Pass and Play',
235
+ definition: 'A gameplay model where a single physical device is handed between participants to perform private actions.',
236
+ },
237
+ {
238
+ term: 'Hidden Agenda',
239
+ definition: 'A secret victory condition or alignment separate from the player\'s apparent group.',
240
+ },
241
+ ],
242
+ },
243
+ ],
244
+ faq,
245
+ bibliography,
246
+ howTo,
247
+ schemas: [
248
+ {
249
+ '@context': 'https://schema.org',
250
+ '@type': 'FAQPage',
251
+ 'mainEntity': faq.map((f) => ({
252
+ '@type': 'Question',
253
+ 'name': f.question,
254
+ 'acceptedAnswer': {
255
+ '@type': 'Answer',
256
+ 'text': f.answer,
257
+ },
258
+ })),
259
+ },
260
+ {
261
+ '@context': 'https://schema.org',
262
+ '@type': 'SoftwareApplication',
263
+ 'name': ui.title,
264
+ 'operatingSystem': 'All',
265
+ 'applicationCategory': 'UtilitiesApplication',
266
+ 'browserRequirements': 'Requires HTML5. Requires JavaScript.',
267
+ },
268
+ {
269
+ '@context': 'https://schema.org',
270
+ '@type': 'HowTo',
271
+ 'name': ui.setupTitle,
272
+ 'step': howTo.map((h) => ({
273
+ '@type': 'HowToStep',
274
+ 'name': h.name,
275
+ 'text': h.text,
276
+ })),
277
+ },
278
+ ],
279
+ };