@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,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: 'Repartidor de Roles Ocultos',
7
+ setupTitle: 'Configuración de Reparto de Roles',
8
+ playerList: 'Lista de Jugadores',
9
+ addPlayer: 'Añadir',
10
+ addPlayerPlaceholder: 'Nombre del jugador...',
11
+ rolePool: 'Grupo de Roles Secretos',
12
+ presetsTitle: 'Plantillas de Juego',
13
+ presetCustom: 'Configuración Personalizada',
14
+ dealRoles: 'Repartir Roles Secretos',
15
+ clearPlayers: 'Borrar Todos',
16
+ instructions: 'Introduce los nombres de los jugadores, configura los roles secretos y pulsa en Repartir Roles Secretos.',
17
+ passTo: 'Pasa el dispositivo a',
18
+ holdToReveal: 'Mantén pulsado para revelar',
19
+ releasingResets: 'Sigue pulsando para revelar...',
20
+ hideRole: 'Entendido, ocultar rol',
21
+ nextPlayer: 'Siguiente Jugador',
22
+ finishedTitle: 'Roles Repartidos',
23
+ finishedDesc: 'Todos los jugadores han visto sus roles en secreto. Ya podéis comenzar la partida.',
24
+ restart: 'Reiniciar y Volver a Repartir',
25
+ rolesCount: 'Roles Seleccionados',
26
+ playersCount: 'Jugadores Añadidos',
27
+ mismatchWarning: 'Se requiere un mínimo de 3 jugadores para repartir roles.',
28
+ werewolfName: 'Hombre Lobo / Mafia',
29
+ werewolfDesc: 'Los aldeanos intentan descubrir y eliminar a los Hombres Lobo ocultos.',
30
+ avalonName: 'The Resistance: Avalon',
31
+ avalonDesc: 'Merlín y los sirvientes leales completan misiones evitando a los saboteadores.',
32
+ hitlerName: 'Secret Hitler',
33
+ hitlerDesc: 'Los liberales intentan aprobar leyes y descubrir al líder secreto.',
34
+ customName: 'Configuración Personalizada',
35
+ customDesc: 'Distribuye cartas con etiquetas simples a los jugadores.',
36
+ roleWerewolfName: 'Hombre Lobo',
37
+ roleWerewolfDesc: 'Elimina en secreto a los Aldeanos por la noche.',
38
+ roleWerewolfSecret: 'Colabora con los otros Hombres Lobo para engañar al pueblo.',
39
+ roleSeerName: 'Vidente',
40
+ roleSeerDesc: 'Comprueba la alineación de un jugador cada noche.',
41
+ roleSeerSecret: 'Identifica a los Hombres Lobo pero no te expongas para sobrevivir.',
42
+ roleDoctorName: 'Doctor',
43
+ roleDoctorDesc: 'Protege a un jugador de ser eliminado cada noche.',
44
+ roleDoctorSecret: 'Mantén a salvo a los miembros clave del pueblo.',
45
+ roleVillagerName: 'Aldeano',
46
+ roleVillagerDesc: 'Encuentra a los Hombres Lobo ocultos.',
47
+ roleVillagerSecret: 'Debate, analiza y vota a los sospechosos.',
48
+ roleMerlinName: 'Merlín',
49
+ roleMerlinDesc: 'Conoce a los agentes del mal.',
50
+ roleMerlinSecret: 'Guía a tu equipo hacia la victoria sin revelar tu identidad.',
51
+ roleAssassinName: 'Asesino',
52
+ roleAssassinDesc: 'Puede asesinar a Merlín al final de la partida.',
53
+ roleAssassinSecret: 'Descubre a Merlín para arrebatar la victoria al final.',
54
+ roleMinionName: 'Esbirro de Mordred',
55
+ roleMinionDesc: 'Agente infiltrado de Mordred.',
56
+ roleMinionSecret: 'Sabotea misiones sin que te descubran.',
57
+ roleServantName: 'Leal Sirviente',
58
+ roleServantDesc: 'Completa misiones para Arturo.',
59
+ roleServantSecret: 'Debate, propone equipos y vota con lógica.',
60
+ roleHitlerName: 'Hitler',
61
+ roleHitlerDesc: 'El líder secreto de los fascistas.',
62
+ roleHitlerSecret: 'Consigue ser elegido canciller o deja que los fascistas aprueben leyes.',
63
+ roleFascistName: 'Fascista',
64
+ roleFascistDesc: 'Colabora para aprobar leyes fascistas.',
65
+ roleFascistSecret: 'Protege a Hitler y manipula las elecciones.',
66
+ roleLiberalName: 'Liberal',
67
+ roleLiberalDesc: 'Detén la amenaza fascista.',
68
+ roleLiberalSecret: 'Aprueba leyes liberales y ejecuta a Hitler si es posible.',
69
+ roleCustomName: 'Rol Personalizado',
70
+ roleCustomDesc: 'Descripción general del rol personalizado.',
71
+ roleCustomSecret: 'Cumple el objetivo de tu equipo.',
72
+ teamWerewolves: 'Hombres Lobo',
73
+ teamVillagers: 'Aldeanos',
74
+ teamGood: 'Leales al Bien',
75
+ teamEvil: 'Agentes del Mal',
76
+ teamFascist: 'Fascistas',
77
+ teamLiberal: 'Liberales',
78
+ teamCustom: 'Equipo Personalizado',
79
+ secretRoleIs: 'tu rol secreto es:',
80
+ customRolesTitle: 'Configuración de Roles Personalizados',
81
+ customRolePlaceholder: 'Nombre del rol...',
82
+ neutralLabel: 'Neutral',
83
+ goodLabel: 'Bueno',
84
+ evilLabel: 'Malvado',
85
+ customMismatchWarning: 'Configura exactamente el mismo número de roles personalizados que de jugadores.',
86
+ impostorPresetName: 'Juego del Impostor',
87
+ impostorPresetDesc: 'Asigna Impostores y Tripulantes con cantidades configurables.',
88
+ impostorTitle: 'Ajustes del Impostor',
89
+ impostorWarning: 'Necesitas más jugadores que impostores.',
90
+ roleImpostorName: 'Impostor',
91
+ roleImpostorDesc: 'Elimina en secreto a los Tripulantes.',
92
+ roleImpostorSecret: 'Sabotea y elimina sin que te descubran.',
93
+ roleCrewmateName: 'Tripulante',
94
+ roleCrewmateDesc: 'Completa tareas y encuentra al Impostor.',
95
+ roleCrewmateSecret: 'La palabra secreta es:',
96
+ teamImpostor: 'Impostor',
97
+ teamCrewmate: 'Tripulante',
98
+ impostorSharedSecretLabel: 'Información Secreta Compartida',
99
+ impostorSharedSecretPlaceholder: 'ej. Lugar: Restaurante, o Palabra: Manzana',
100
+ impostorModeLabel: 'Modo de Cálculo de Impostores',
101
+ impostorModeFixed: 'Cantidad Fija',
102
+ impostorModePercentage: 'Porcentaje',
103
+ impostorModeRange: 'Rango Aleatorio',
104
+ impostorFixedLabel: 'Número de Impostores',
105
+ impostorPercentageLabel: 'Porcentaje de Impostores (%)',
106
+ impostorRangeMinLabel: 'Impostores Mínimos',
107
+ impostorRangeMaxLabel: 'Impostores Máximos',
108
+ impostorWriterLabel: 'Escritor de Palabra / Anfitrión',
109
+ impostorWriterRandom: 'Anfitrión no jugador',
110
+ roleWriterName: 'Escritor',
111
+ roleWriterDesc: 'Tú decides la palabra secreta.',
112
+ writerInputPrompt: 'Eres el Escritor. Introduce la palabra o lugar secreto para esta partida:',
113
+ writerInputPlaceholder: 'ej. Restaurante, Hospital...',
114
+ btnSetWord: 'Guardar y Empezar',
115
+ impostorWriterPreround: 'Ronda Previa Secreta (Todos los jugadores)',
116
+ impostorWriterDescHost: 'El anfitrión no jugador usa una palabra aleatoria o preestablecida.',
117
+ impostorWriterDescPreround: 'La ronda previa permite a todos los jugadores escribir palabras en secreto y elige una al azar.',
118
+ impostorWriterDescPlayer: 'El jugador seleccionado escribe la palabra y no puede ser impostor.',
119
+ preroundPassTitle: 'Ronda previa: Pasa el dispositivo a',
120
+ preroundInputPrompt: 'Escribe una palabra o lugar en secreto:',
121
+ preroundPassHint: '¡Mantén la palabra en secreto para los demás!',
122
+ btnSubmitWord: 'Enviar Palabra',
123
+ };
124
+
125
+ const faq = [
126
+ {
127
+ question: '¿Cómo funciona el Repartidor de Roles Ocultos?',
128
+ answer: 'El Repartidor de Roles Ocultos permite asignar roles secretos para juegos de mesa de deducción social localmente en un solo dispositivo. Introduces los nombres de los jugadores, eliges una plantilla de juego o personalizas los roles, y luego pasas el dispositivo de jugador en jugador. Cada jugador usa un botón de revelado seguro para ver su rol en privado antes de pasarlo al siguiente.',
129
+ },
130
+ {
131
+ question: '¿Cuál es el propósito de mantener pulsado para revelar?',
132
+ answer: 'Para evitar que los jugadores vean accidentalmente los roles de los demás, la herramienta requiere mantener pulsado el botón de revelado. Si el jugador suelta el botón, el rol se oculta de inmediato.',
133
+ },
134
+ {
135
+ question: '¿Hay plantillas para juegos populares?',
136
+ answer: 'Sí. La herramienta incluye plantillas listas para usar en juegos populares como Hombre Lobo, Avalon y Secret Hitler, ajustando automáticamente la reserva de roles según el número de jugadores.',
137
+ },
138
+ {
139
+ question: '¿Puedo crear un reparto de roles totalmente personalizado?',
140
+ answer: 'Sí. Puedes seleccionar la plantilla de configuración personalizada y definir exactamente qué roles y alineaciones quieres distribuir a tus jugadores.',
141
+ },
142
+ ];
143
+
144
+ const howTo = [
145
+ {
146
+ name: 'Añadir Jugadores',
147
+ text: 'Introduce los nombres de los participantes en el panel de configuración.',
148
+ },
149
+ {
150
+ name: 'Seleccionar Plantilla',
151
+ text: 'Elige una de las configuraciones de juego integradas o crea tu propio grupo de roles.',
152
+ },
153
+ {
154
+ name: 'Pasar y Revelar',
155
+ text: 'Pasa el dispositivo a cada jugador. Cada uno debe mantener pulsado el botón de revelar para ver su rol en secreto y luego pulsar en ocultar.',
156
+ },
157
+ ];
158
+
159
+ export const content: ToolLocaleContent<HiddenRoleDealerUI> = {
160
+ slug: 'repartidor-roles-ocultos-secretos',
161
+ title: 'Repartidor de Roles Ocultos: Distribuidor de Cartas e Identidades Secretas',
162
+ description: 'Reparte roles secretos localmente para juegos de deducción social como Hombre Lobo, Avalon, Secret Hitler e Impostor sin necesidad de cartas físicas.',
163
+ ui,
164
+ seo: [
165
+ { type: 'title', text: 'Equilibrando Equipos en Juegos de Deducción Social', level: 2 },
166
+ { type: 'paragraph', html: 'Uno de los mayores desafíos al jugar a Hombre Lobo, Avalon o Secret Hitler es equilibrar la proporción de roles del bando del bien y del bando del mal. Una proporción incorrecta puede hacer que la partida sea demasiado fácil para un bando y frustrante para el otro. Al utilizar proporciones matemáticas de la comunidad y configuraciones recomendadas, garantizas una sesión de juego competitiva y justa.' },
167
+ {
168
+ type: 'table',
169
+ headers: ['Jugadores Totales', 'Bando del Bien', 'Bando del Mal', 'Plantillas de Juego Recomendadas'],
170
+ rows: [
171
+ ['5 Jugadores', '3 Buenos (o Liberales)', '2 Malos (o Fascistas)', 'Avalon o Secret Hitler'],
172
+ ['6 Jugadores', '4 Buenos (o Liberales)', '2 Malos (o Fascistas)', 'Avalon o Secret Hitler'],
173
+ ['7 Jugadores', '5 Buenos (o Liberales)', '2 Malos (o Fascistas / Hitler)', 'Hombre Lobo, Avalon o Secret Hitler'],
174
+ ['8 Jugadores', '5 Buenos (o Liberales)', '3 Malos (o Fascistas / Hitler)', 'Hombre Lobo, Avalon o Secret Hitler'],
175
+ ['9 Jugadores', '6 Buenos (o Liberales)', '3 Malos (o Fascistas / Hitler)', 'Hombre Lobo, Avalon o Secret Hitler'],
176
+ ['10 Jugadores', '6 Buenos (o Liberales)', '4 Malos (o Fascistas / Hitler)', 'Hombre Lobo, Avalon o Secret Hitler'],
177
+ ],
178
+ },
179
+ { type: 'title', text: 'Configuración de Juegos de Impostor y Spyfall sin Anfitrión', level: 2 },
180
+ { type: 'paragraph', html: 'Para jugar a juegos de asociación de palabras como Spyfall o Impostor de manera fluida en una sola pantalla, la distribución de roles debe ser imparcial. Si un jugador actúa como Anfitrión designado, escribe la palabra y automáticamente pasa a ser un Tripulante. Por otro lado, la opción Anfitrión no jugador permite que la aplicación asigne palabras de forma automática. Para un misterio absoluto, la Ronda Previa Secreta permite a tres jugadores escribir palabras en secreto y elige una al azar, de modo que todos jueguen sin información previa.' },
181
+ { type: 'title', text: 'Buenas Prácticas para el Reparto de Dispositivo en Mano', level: 2 },
182
+ { type: 'paragraph', html: 'Compartir una única pantalla para repartir identidades secretas es cómodo pero propenso a miradas indiscretas. Para mantener el secreto absoluto, el facilitador del juego debe asegurar que se pase el dispositivo siempre en el mismo sentido, que los jugadores inclinen la pantalla al revelar su carta y que suelten el botón inmediatamente si otro jugador intenta mirar.' },
183
+ {
184
+ type: 'comparative',
185
+ items: [
186
+ {
187
+ title: 'Hombre Lobo / Mafia',
188
+ description: 'Requiere un narrador para moderar los turnos nocturnos. Es ideal para grupos grandes de fiesta donde la eliminación de jugadores genera tensión y debate.',
189
+ icon: 'mdi:ghost',
190
+ highlight: false,
191
+ points: [
192
+ 'Moderado por narrador',
193
+ 'Mecánica de eliminación',
194
+ 'Perfecto para grupos grandes',
195
+ ],
196
+ },
197
+ {
198
+ title: 'The Resistance / Avalon',
199
+ description: 'Sin eliminación de jugadores. Las sospechas se centran en los votos y en las misiones fallidas, aportando una alta carga de deducción lógica.',
200
+ icon: 'mdi:shield-outline',
201
+ highlight: true,
202
+ points: [
203
+ 'Sin eliminación de jugadores',
204
+ 'Basado en misiones y votos',
205
+ 'Alta profundidad estratégica',
206
+ ],
207
+ },
208
+ {
209
+ title: 'Secret Hitler',
210
+ description: 'Utiliza la incertidumbre de la pila de leyes y las elecciones presidenciales para sembrar sospechas y crear discusiones rápidas.',
211
+ icon: 'mdi:incognito',
212
+ highlight: false,
213
+ points: [
214
+ 'Incertidumbre al robar leyes',
215
+ 'Elecciones presidenciales rápidas',
216
+ 'Debates intensos en grupo',
217
+ ],
218
+ },
219
+ ],
220
+ columns: 3,
221
+ },
222
+ {
223
+ type: 'glossary',
224
+ items: [
225
+ {
226
+ term: 'Deducción Social',
227
+ definition: 'Género de juegos donde los participantes intentan descubrir la identidad y lealtad oculta de los demás.',
228
+ },
229
+ {
230
+ term: 'Narrador / Moderador',
231
+ definition: 'Facilitador del juego que dirige las fases nocturnas y diurnas sin tomar parte activa en los bandos.',
232
+ },
233
+ {
234
+ term: 'Dispositivo en Mano',
235
+ definition: 'Modelo de juego local donde los jugadores se van pasando un único dispositivo móvil para realizar acciones privadas.',
236
+ },
237
+ {
238
+ term: 'Alineación Oculta',
239
+ definition: 'La lealtad secreta (bueno, malo o neutral) que determina las condiciones de victoria de un jugador.',
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
+ };
@@ -0,0 +1,215 @@
1
+ import { bibliography } from '../bibliography';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { HiddenRoleDealerUI } from '../entry';
4
+
5
+ const ui: HiddenRoleDealerUI = {
6
+ title: 'Distributeur de Rôles Cachés',
7
+ setupTitle: 'Configuration de la Distribution',
8
+ playerList: 'Liste des Joueurs',
9
+ addPlayer: 'Ajouter',
10
+ addPlayerPlaceholder: 'Nom du joueur...',
11
+ rolePool: 'Groupe de Rôles Secrets',
12
+ presetsTitle: 'Modèles de Jeu',
13
+ presetCustom: 'Configuration Personnalisée',
14
+ dealRoles: 'Distribuer les Rôles Secrets',
15
+ clearPlayers: 'Tout Effacer',
16
+ instructions: 'Saisissez les noms des joueurs, configurez les rôles secrets et appuyez sur Distribuer les Rôles Secrets.',
17
+ passTo: 'Passez l\'appareil à',
18
+ holdToReveal: 'Maintenez pour révéler',
19
+ releasingResets: 'Maintenez enfoncé pour révéler...',
20
+ hideRole: 'Compris, masquer le rôle',
21
+ nextPlayer: 'Joueur Suivant',
22
+ finishedTitle: 'Tous les Rôles Distribués',
23
+ finishedDesc: 'Tous les joueurs ont secrètement consulté leur rôle. Vous pouvez commencer la partie.',
24
+ restart: 'Recommencer et Redistribuer',
25
+ rolesCount: 'Rôles Sélectionnés',
26
+ playersCount: 'Joueurs Ajoutés',
27
+ mismatchWarning: 'Un minimum de 3 joueurs est requis pour distribuer les rôles.',
28
+ werewolfName: 'Loup-Garou / Mafia',
29
+ werewolfDesc: 'Les Villageois tentent de démasquer et d\'éliminer les Loups-Garous cachés.',
30
+ avalonName: 'The Resistance: Avalon',
31
+ avalonDesc: 'Merlin et les fidèles serviteurs accomplissent des quêtes tout en évitant les saboteurs.',
32
+ hitlerName: 'Secret Hitler',
33
+ hitlerDesc: 'Les Libéraux tentent de faire passer des lois et de démasquer le leader secret.',
34
+ customName: 'Configuration Personnalisée',
35
+ customDesc: 'Distribuez des cartes avec des étiquettes simples aux joueurs.',
36
+ roleWerewolfName: 'Loup-Garou',
37
+ roleWerewolfDesc: 'Éliminez secrètement les Villageois pendant la nuit.',
38
+ roleWerewolfSecret: 'Collaborez avec les autres Loups-Garous pour tromper le village.',
39
+ roleSeerName: 'Voyante',
40
+ roleSeerDesc: 'Vérifiez l\'alignement d\'un joueur chaque nuit.',
41
+ roleSeerSecret: 'Identifiez les Loups-Garous mais restez cachée pour survivre.',
42
+ roleDoctorName: 'Docteur',
43
+ roleDoctorDesc: 'Protégez un joueur de l\'élimination chaque nuit.',
44
+ roleDoctorSecret: 'Gardez en sécurité les membres clés du village.',
45
+ roleVillagerName: 'Villageois',
46
+ roleVillagerDesc: 'Trouvez les Loups-Garous cachés.',
47
+ roleVillagerSecret: 'Débattez, analysez et votez contre les suspects.',
48
+ roleMerlinName: 'Merlin',
49
+ roleMerlinDesc: 'Connaît les agents du mal.',
50
+ roleMerlinSecret: 'Guidez l\'équipe vers le succès sans vous révéler.',
51
+ roleAssassinName: 'Assassin',
52
+ roleAssassinDesc: 'Peut assassiner Merlin à la fin du jeu.',
53
+ roleAssassinSecret: 'Trouvez Merlin pour arracher la victoire à la fin.',
54
+ roleMinionName: 'Larbin de Mordred',
55
+ roleMinionDesc: 'Agent infiltré de Mordred.',
56
+ roleMinionSecret: 'Sabotez les quêtes sans vous faire détecter.',
57
+ roleServantName: 'Fidèle Serviteur',
58
+ roleServantDesc: 'Accomplissez des quêtes pour Arthur.',
59
+ roleServantSecret: 'Débattez, proposez des équipes et votez logiquement.',
60
+ roleHitlerName: 'Hitler',
61
+ roleHitlerDesc: 'Le leader secret des Fascistes.',
62
+ roleHitlerSecret: 'Faites-vous élire Chancelier ou laissez les Fascistes adopter des lois.',
63
+ roleFascistName: 'Fasciste',
64
+ roleFascistDesc: 'Coordonnez pour adopter des lois fascistes.',
65
+ roleFascistSecret: 'Protégez Hitler et manipulez les élections.',
66
+ roleLiberalName: 'Libéral',
67
+ roleLiberalDesc: 'Trouvez et stoppez la menace fasciste.',
68
+ roleLiberalSecret: 'Adoptez des lois libérales et éliminez Hitler si possible.',
69
+ roleCustomName: 'Rôle Personnalisé',
70
+ roleCustomDesc: 'Description générale du rôle personnalisé.',
71
+ roleCustomSecret: 'Remplissez l\'objectif de votre équipe.',
72
+ teamWerewolves: 'Loups-Garous',
73
+ teamVillagers: 'Villageois',
74
+ teamGood: 'Bien',
75
+ teamEvil: 'Mal',
76
+ teamFascist: 'Fasciste',
77
+ teamLiberal: 'Libéral',
78
+ teamCustom: 'Équipe Personnalisée',
79
+ secretRoleIs: 'votre rôle secret est :',
80
+ customRolesTitle: 'Configuration des Rôles Personnalisés',
81
+ customRolePlaceholder: 'Nom du rôle...',
82
+ neutralLabel: 'Neutre',
83
+ goodLabel: 'Bien',
84
+ evilLabel: 'Mal',
85
+ customMismatchWarning: 'Configurez exactement le même nombre de rôles personnalisés que de joueurs.',
86
+ impostorPresetName: 'Jeu de l\'Imposteur',
87
+ impostorPresetDesc: 'Attribuez des rôles d\'Imposteur et d\'Équipier avec des quantités personnalisables.',
88
+ impostorTitle: 'Paramètres de l\'Imposteur',
89
+ impostorWarning: 'Vous devez avoir plus de joueurs que d\'imposteurs.',
90
+ roleImpostorName: 'Impostor',
91
+ roleImpostorDesc: 'Éliminez secrètement les Équipiers.',
92
+ roleImpostorSecret: 'Sabotez et éliminez sans vous faire repérer.',
93
+ roleCrewmateName: 'Équipier',
94
+ roleCrewmateDesc: 'Complétez les tâches et démasquez l\'Imposteur.',
95
+ roleCrewmateSecret: 'Le mot secret est :',
96
+ teamImpostor: 'Imposteur',
97
+ teamCrewmate: 'Équipier',
98
+ impostorSharedSecretLabel: 'Information Secrète Partagée',
99
+ impostorSharedSecretPlaceholder: 'ex. Lieu : Restaurant, ou Mot : Pomme',
100
+ impostorModeLabel: 'Mode de Calcul des Imposteurs',
101
+ impostorModeFixed: 'Nombre Fixe',
102
+ impostorModePercentage: 'Pourcentage',
103
+ impostorModeRange: 'Plage Aléatoire',
104
+ impostorFixedLabel: 'Nombre d\'Imposteurs',
105
+ impostorPercentageLabel: 'Pourcentage d\'Imposteurs (%)',
106
+ impostorRangeMinLabel: 'Imposteurs Minimum',
107
+ impostorRangeMaxLabel: 'Imposteurs Maximum',
108
+ impostorWriterLabel: 'Rédacteur du Mot / Hôte',
109
+ impostorWriterRandom: 'Hôte non-joueur',
110
+ roleWriterName: 'Rédacteur',
111
+ roleWriterDesc: 'Vous décidez du mot secret.',
112
+ writerInputPrompt: 'Vous êtes le Rédacteur. Saisissez le mot ou lieu secret pour cette partie :',
113
+ writerInputPlaceholder: 'ex. Restaurant, Hôpital...',
114
+ btnSetWord: 'Enregistrer et Commencer',
115
+ impostorWriterPreround: 'Pré-tour Secret (Tous les joueurs)',
116
+ impostorWriterDescHost: 'L\'hôte non-joueur utilise un mot aléatoire ou prédéfini.',
117
+ impostorWriterDescPreround: 'Le pré-tour permet à tous les joueurs d\'écrire des mots en secret, puis en choisit un au hasard.',
118
+ impostorWriterDescPlayer: 'Le joueur sélectionné écrit le mot et ne peut pas être imposteur.',
119
+ preroundPassTitle: 'Pré-tour : Passez l\'appareil à',
120
+ preroundInputPrompt: 'Écrivez secrètement un mot ou un lieu :',
121
+ preroundPassHint: 'Gardez le mot secret pour les autres joueurs !',
122
+ btnSubmitWord: 'Envoyer le Mot',
123
+ };
124
+
125
+ const faq = [
126
+ {
127
+ question: 'Comment fonctionne le Distributeur de Rôles Cachés ?',
128
+ answer: 'Le Distributeur de Rôles Cachés permet d\'attribuer des rôles secrets pour les jeux de déduction sociale localement sur un seul appareil. Vous saisissez les noms des joueurs, choisissez un modèle ou personnalisez les rôles, puis passez l\'appareil de joueur en joueur. Chaque joueur utilise un bouton sécurisé pour révéler son rôle en privé.',
129
+ },
130
+ {
131
+ question: 'Quel est l\'intérêt de maintenir le bouton enfoncé ?',
132
+ answer: 'Pour éviter que les joueurs ne voient accidentellement le rôle de leur voisin, l\'outil impose de maintenir le bouton enfoncé. Dès qu\'il est relâché, le rôle est masqué instantanément.',
133
+ },
134
+ {
135
+ question: 'Existe-t-il des modèles pour les jeux connus ?',
136
+ answer: 'Oui. L\'outil propose des modèles prêts à l\'emploi pour Loup-Garou, Avalon et Secret Hitler, adaptant automatiquement la réserve de rôles selon le nombre de joueurs.',
137
+ },
138
+ ];
139
+
140
+ const howTo = [
141
+ {
142
+ name: 'Ajouter les Joueurs',
143
+ text: 'Saisissez les noms des participants dans le panneau de configuration.',
144
+ },
145
+ {
146
+ name: 'Choisir le Modèle',
147
+ text: 'Sélectionnez un modèle intégré ou créez une configuration de rôles sur mesure.',
148
+ },
149
+ {
150
+ name: 'Passer et Révéler',
151
+ text: 'Passez l\'appareil à chaque joueur. Chacun doit maintenir le bouton pour consulter son rôle puis le masquer.',
152
+ },
153
+ ];
154
+
155
+ export const content: ToolLocaleContent<HiddenRoleDealerUI> = {
156
+ slug: 'distributeur-roles-caches-secrets',
157
+ title: 'Distributeur de Rôles Cachés : Attribution Secrète d\'Identités',
158
+ description: 'Distribuez les rôles secrets localement pour vos jeux de société comme Loup-Garou, Avalon, Secret Hitler ou Imposteur sans cartes physiques.',
159
+ ui,
160
+ seo: [
161
+ { type: 'title', text: 'Équilibrage des Équipes dans les Jeux de Déduction Sociale', level: 2 },
162
+ { type: 'paragraph', html: 'Le défi majeur de jeux comme Loup-Garou, Avalon ou Secret Hitler réside dans l\'équilibrage entre les forces du bien et les agents du mal. Une mauvaise proportion peut rendre le jeu trop simple pour un camp et frustrant pour l\'autre. En appliquant les ratios de communauté recommandés et des statistiques éprouvées, vous assurez une partie équitable.' },
163
+ {
164
+ type: 'table',
165
+ headers: ['Nombre de Joueurs', 'Camp du Bien', 'Camp du Mal', 'Modèles Recommandés'],
166
+ rows: [
167
+ ['5 Joueurs', '3 Bons (ou Libéraux)', '2 Méchants (ou Fascistes)', 'Avalon ou Secret Hitler'],
168
+ ['6 Joueurs', '4 Bons (ou Libéraux)', '2 Méchants (ou Fascistes)', 'Avalon ou Secret Hitler'],
169
+ ['7 Joueurs', '5 Bons (ou Libéraux)', '2 Méchants (ou Fascistes / Hitler)', 'Loup-Garou, Avalon ou Secret Hitler'],
170
+ ['8 Joueurs', '5 Bons (ou Libéraux)', '3 Méchants (ou Fascistes / Hitler)', 'Loup-Garou, Avalon ou Secret Hitler'],
171
+ ['9 Joueurs', '6 Bons (ou Libéraux)', '3 Méchants (ou Fascistes / Hitler)', 'Loup-Garou, Avalon ou Secret Hitler'],
172
+ ['10 Joueurs', '6 Bons (ou Libéraux)', '4 Méchants (ou Fascistes / Hitler)', 'Loup-Garou, Avalon ou Secret Hitler'],
173
+ ],
174
+ },
175
+ { type: 'title', text: 'Configuration de Jeux d\'Imposteur et Spyfall sans Hôte', level: 2 },
176
+ { type: 'paragraph', html: 'Pour animer des jeux d\'association de mots comme Spyfall ou Imposteur de manière fluide sur un seul écran, la distribution des rôles doit rester impartiale. Si un joueur agit en tant qu\'Hôte désigné, il saisit le mot et devient automatiquement un Équipier. Alternativement, l\'Hôte non-joueur laisse l\'application attribuer les mots automatiquement. Pour un mystère complet, le Pré-tour Secret permet à trois joueurs de saisir des mots en toute discrétion et en sélectionne un de manière aléatoire.' },
177
+ { type: 'title', text: 'Bonnes Pratiques pour le Jeu sur Appareil Partagé', level: 2 },
178
+ { type: 'paragraph', html: 'Partager un écran pour distribuer des identités secrètes est pratique mais sensible aux regards indiscrets. Pour préserver le secret absolu, l\'animateur doit faire passer l\'appareil toujours dans le même sens, et les joueurs doivent incliner l\'écran lors du dévoilement de leur rôle.' },
179
+ ],
180
+ faq,
181
+ bibliography,
182
+ howTo,
183
+ schemas: [
184
+ {
185
+ '@context': 'https://schema.org',
186
+ '@type': 'FAQPage',
187
+ 'mainEntity': faq.map((f) => ({
188
+ '@type': 'Question',
189
+ 'name': f.question,
190
+ 'acceptedAnswer': {
191
+ '@type': 'Answer',
192
+ 'text': f.answer,
193
+ },
194
+ })),
195
+ },
196
+ {
197
+ '@context': 'https://schema.org',
198
+ '@type': 'SoftwareApplication',
199
+ 'name': ui.title,
200
+ 'operatingSystem': 'All',
201
+ 'applicationCategory': 'UtilitiesApplication',
202
+ 'browserRequirements': 'Requires HTML5. Requires JavaScript.',
203
+ },
204
+ {
205
+ '@context': 'https://schema.org',
206
+ '@type': 'HowTo',
207
+ 'name': ui.setupTitle,
208
+ 'step': howTo.map((h) => ({
209
+ '@type': 'HowToStep',
210
+ 'name': h.name,
211
+ 'text': h.text,
212
+ })),
213
+ },
214
+ ],
215
+ };