@jjlmoya/utils-tabletop 1.10.0 → 1.12.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 (76) hide show
  1. package/package.json +1 -1
  2. package/src/entries.ts +8 -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 +2 -0
  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/dice-roller-simulator/component.astro +116 -26
  9. package/src/tool/hidden-role-dealer/bibliography.astro +16 -0
  10. package/src/tool/hidden-role-dealer/bibliography.ts +12 -0
  11. package/src/tool/hidden-role-dealer/client.ts +265 -0
  12. package/src/tool/hidden-role-dealer/component.astro +184 -0
  13. package/src/tool/hidden-role-dealer/entry.ts +145 -0
  14. package/src/tool/hidden-role-dealer/hidden-role-dealer.css +604 -0
  15. package/src/tool/hidden-role-dealer/i18n/de.ts +195 -0
  16. package/src/tool/hidden-role-dealer/i18n/en.ts +279 -0
  17. package/src/tool/hidden-role-dealer/i18n/es.ts +279 -0
  18. package/src/tool/hidden-role-dealer/i18n/fr.ts +215 -0
  19. package/src/tool/hidden-role-dealer/i18n/id.ts +191 -0
  20. package/src/tool/hidden-role-dealer/i18n/it.ts +191 -0
  21. package/src/tool/hidden-role-dealer/i18n/ja.ts +191 -0
  22. package/src/tool/hidden-role-dealer/i18n/ko.ts +191 -0
  23. package/src/tool/hidden-role-dealer/i18n/nl.ts +191 -0
  24. package/src/tool/hidden-role-dealer/i18n/pl.ts +191 -0
  25. package/src/tool/hidden-role-dealer/i18n/pt.ts +191 -0
  26. package/src/tool/hidden-role-dealer/i18n/ru.ts +191 -0
  27. package/src/tool/hidden-role-dealer/i18n/sv.ts +191 -0
  28. package/src/tool/hidden-role-dealer/i18n/tr.ts +191 -0
  29. package/src/tool/hidden-role-dealer/i18n/zh.ts +191 -0
  30. package/src/tool/hidden-role-dealer/index.ts +10 -0
  31. package/src/tool/hidden-role-dealer/logic.test.ts +99 -0
  32. package/src/tool/hidden-role-dealer/logic.ts +134 -0
  33. package/src/tool/hidden-role-dealer/modules/custom-role-manager.ts +35 -0
  34. package/src/tool/hidden-role-dealer/modules/dealer-logic.ts +73 -0
  35. package/src/tool/hidden-role-dealer/modules/hold-controller.ts +38 -0
  36. package/src/tool/hidden-role-dealer/modules/particle-effects.ts +40 -0
  37. package/src/tool/hidden-role-dealer/modules/player-manager.ts +44 -0
  38. package/src/tool/hidden-role-dealer/modules/presets.ts +46 -0
  39. package/src/tool/hidden-role-dealer/modules/setup-handlers.ts +34 -0
  40. package/src/tool/hidden-role-dealer/modules/storage.ts +23 -0
  41. package/src/tool/hidden-role-dealer/modules/utils.ts +18 -0
  42. package/src/tool/hidden-role-dealer/modules/wizard-html.ts +161 -0
  43. package/src/tool/hidden-role-dealer/modules/wizard-renderer.ts +161 -0
  44. package/src/tool/hidden-role-dealer/modules/writer-handler.ts +70 -0
  45. package/src/tool/hidden-role-dealer/seo.astro +16 -0
  46. package/src/tool/hidden-role-dealer/types.ts +31 -0
  47. package/src/tool/scatter-direction-selector/animation.ts +278 -0
  48. package/src/tool/scatter-direction-selector/bibliography.astro +16 -0
  49. package/src/tool/scatter-direction-selector/bibliography.ts +12 -0
  50. package/src/tool/scatter-direction-selector/client.ts +296 -0
  51. package/src/tool/scatter-direction-selector/component.astro +184 -0
  52. package/src/tool/scatter-direction-selector/entry.ts +59 -0
  53. package/src/tool/scatter-direction-selector/history.ts +71 -0
  54. package/src/tool/scatter-direction-selector/i18n/de.ts +143 -0
  55. package/src/tool/scatter-direction-selector/i18n/en.ts +231 -0
  56. package/src/tool/scatter-direction-selector/i18n/es.ts +143 -0
  57. package/src/tool/scatter-direction-selector/i18n/fr.ts +143 -0
  58. package/src/tool/scatter-direction-selector/i18n/id.ts +143 -0
  59. package/src/tool/scatter-direction-selector/i18n/it.ts +143 -0
  60. package/src/tool/scatter-direction-selector/i18n/ja.ts +143 -0
  61. package/src/tool/scatter-direction-selector/i18n/ko.ts +143 -0
  62. package/src/tool/scatter-direction-selector/i18n/nl.ts +143 -0
  63. package/src/tool/scatter-direction-selector/i18n/pl.ts +143 -0
  64. package/src/tool/scatter-direction-selector/i18n/pt.ts +143 -0
  65. package/src/tool/scatter-direction-selector/i18n/ru.ts +143 -0
  66. package/src/tool/scatter-direction-selector/i18n/sv.ts +143 -0
  67. package/src/tool/scatter-direction-selector/i18n/tr.ts +143 -0
  68. package/src/tool/scatter-direction-selector/i18n/zh.ts +143 -0
  69. package/src/tool/scatter-direction-selector/index.ts +10 -0
  70. package/src/tool/scatter-direction-selector/logic.test.ts +62 -0
  71. package/src/tool/scatter-direction-selector/logic.ts +52 -0
  72. package/src/tool/scatter-direction-selector/scatter-direction-selector.css +794 -0
  73. package/src/tool/scatter-direction-selector/seo.astro +16 -0
  74. package/src/tool/scatter-direction-selector/settings.ts +81 -0
  75. package/src/tool/scatter-direction-selector/sound.ts +22 -0
  76. package/src/tools.ts +4 -0
@@ -0,0 +1,191 @@
1
+ import { bibliography } from '../bibliography';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { HiddenRoleDealerUI } from '../entry';
4
+
5
+ const ui: HiddenRoleDealerUI = {
6
+ title: 'Distribuidor de Papéis Secretos',
7
+ setupTitle: 'Configuração de Distribuição',
8
+ playerList: 'Lista de Jogadores',
9
+ addPlayer: 'Adicionar',
10
+ addPlayerPlaceholder: 'Nome do jogador...',
11
+ rolePool: 'Grupo de Papéis Secretos',
12
+ presetsTitle: 'Modelos de Jogo',
13
+ presetCustom: 'Configuração Personalizada',
14
+ dealRoles: 'Distribuir Papéis Secretos',
15
+ clearPlayers: 'Apagar Tudo',
16
+ instructions: 'Insira os nomes dos jogadores, configure os papéis secretos e clique em Distribuir Papéis Secretos.',
17
+ passTo: 'Passe o dispositivo para',
18
+ holdToReveal: 'Pressione para revelar',
19
+ releasingResets: 'Continue pressionando para revelar...',
20
+ hideRole: 'Entendido, ocultar papel',
21
+ nextPlayer: 'Próximo Jogador',
22
+ finishedTitle: 'Todos os Papéis Distribuídos',
23
+ finishedDesc: 'Todos os jogadores visualizaram os seus papéis em segredo. Já podem começar o jogo.',
24
+ restart: 'Reiniciar e Redistribuir',
25
+ rolesCount: 'Papéis Selecionados',
26
+ playersCount: 'Jogadores Adicionados',
27
+ mismatchWarning: 'É necessário um mínimo de 3 jogadores para distribuir papéis.',
28
+ werewolfName: 'Lobisomem / Mafia',
29
+ werewolfDesc: 'Aldeões tentam encontrar e eliminar Lobisomens disfarçados.',
30
+ avalonName: 'The Resistance: Avalon',
31
+ avalonDesc: 'Merlin e leais servos realizam missões enquanto evitam os sabotadores.',
32
+ hitlerName: 'Secret Hitler',
33
+ hitlerDesc: 'Liberais tentam aprovar leis e encontrar o líder secreto.',
34
+ customName: 'Configuração Personalizada',
35
+ customDesc: 'Distribua cartas com rótulos simples aos jogadores.',
36
+ roleWerewolfName: 'Lobisomem',
37
+ roleWerewolfDesc: 'Elimine aldeões secretamente durante a noite.',
38
+ roleWerewolfSecret: 'Colabore com outros Lobisomens para enganar a aldeia.',
39
+ roleSeerName: 'Cartomante',
40
+ roleSeerDesc: 'Verifique a lealdade de um jogador a cada noite.',
41
+ roleSeerSecret: 'Identifique os Lobisomens, mas mantenha-se em segredo para sobreviver.',
42
+ roleDoctorName: 'Médico',
43
+ roleDoctorDesc: 'Proteja um jogador contra eliminação a cada noite.',
44
+ roleDoctorSecret: 'Mantenha os membros cruciais da aldeia a salvo.',
45
+ roleVillagerName: 'Aldeão',
46
+ roleVillagerDesc: 'Encontre os Lobisomens escondidos.',
47
+ roleVillagerSecret: 'Debata, analise e vote contra os suspeitos.',
48
+ roleMerlinName: 'Merlin',
49
+ roleMerlinDesc: 'Conhece as forças do mal.',
50
+ roleMerlinSecret: 'Guie a sua equipa para a vitória sem expor a sua identidade.',
51
+ roleAssassinName: 'Assassino',
52
+ roleAssassinDesc: 'Pode assassinar Merlin no final do jogo.',
53
+ roleAssassinSecret: 'Identifique Merlin para roubar a vitória no final.',
54
+ roleMinionName: 'Servo de Mordred',
55
+ roleMinionDesc: 'Agente infiltrado de Mordred.',
56
+ roleMinionSecret: 'Sabote as missões sem se deixar apanhar.',
57
+ roleServantName: 'Servo Leal',
58
+ roleServantDesc: 'Complete missões para Arthur.',
59
+ roleServantSecret: 'Debata, proponha equipas e vote com lógica.',
60
+ roleHitlerName: 'Hitler',
61
+ roleHitlerDesc: 'O líder secreto dos Fascistas.',
62
+ roleHitlerSecret: 'Seja eleito Chanceler ou ajude os Fascistas a aprovar leis.',
63
+ roleFascistName: 'Fascista',
64
+ roleFascistDesc: 'Coordenar para promulgar leis fascistas.',
65
+ roleFascistSecret: 'Proteja Hitler e manipule as eleições.',
66
+ roleLiberalName: 'Liberal',
67
+ roleLiberalDesc: 'Impedir a ameaça fascista.',
68
+ roleLiberalSecret: 'Aprove leis liberais e execute Hitler se possível.',
69
+ roleCustomName: 'Papel Personalizado',
70
+ roleCustomDesc: 'Descrição genérica do papel personalizado.',
71
+ roleCustomSecret: 'Cumpra o objetivo da sua equipa.',
72
+ teamWerewolves: 'Lobisomens',
73
+ teamVillagers: 'Aldeões',
74
+ teamGood: 'Bem',
75
+ teamEvil: 'Mal',
76
+ teamFascist: 'Fascista',
77
+ teamLiberal: 'Liberal',
78
+ teamCustom: 'Equipa Personalizada',
79
+ secretRoleIs: 'o seu papel secreto é:',
80
+ customRolesTitle: 'Configuração de Papéis Personalizados',
81
+ customRolePlaceholder: 'Nome do papel...',
82
+ neutralLabel: 'Neutral',
83
+ goodLabel: 'Bom',
84
+ evilLabel: 'Mau',
85
+ customMismatchWarning: 'Configure o mesmo número de papéis personalizados e de jogadores.',
86
+ impostorPresetName: 'Jogo do Impostor',
87
+ impostorPresetDesc: 'Atribua papéis de Impostor e Tripulante com quantidades personalizáveis.',
88
+ impostorTitle: 'Definições do Impostor',
89
+ impostorWarning: 'Necessita de ter mais jogadores do que impostores.',
90
+ roleImpostorName: 'Impostor',
91
+ roleImpostorDesc: 'Elimine os tripulantes secretamente.',
92
+ roleImpostorSecret: 'Sabote e elimine sem ser descoberto.',
93
+ roleCrewmateName: 'Tripulante',
94
+ roleCrewmateDesc: 'Faça tarefas e descubra o Impostor.',
95
+ roleCrewmateSecret: 'A palavra secreta é:',
96
+ teamImpostor: 'Impostor',
97
+ teamCrewmate: 'Tripulante',
98
+ impostorSharedSecretLabel: 'Informação Secreta Partilhada',
99
+ impostorSharedSecretPlaceholder: 'ex. Lugar: Restaurante, ou Palavra: Maçã',
100
+ impostorModeLabel: 'Método de Cálculo de Impostores',
101
+ impostorModeFixed: 'Quantidade Fixa',
102
+ impostorModePercentage: 'Percentagem',
103
+ impostorModeRange: 'Intervalo Aleatório',
104
+ impostorFixedLabel: 'Número de Impostores',
105
+ impostorPercentageLabel: 'Percentagem de Impostores (%)',
106
+ impostorRangeMinLabel: 'Impostores Mínimos',
107
+ impostorRangeMaxLabel: 'Impostores Máximos',
108
+ impostorWriterLabel: 'Escritor de Palavra / Host',
109
+ impostorWriterRandom: 'Host não-jogador',
110
+ roleWriterName: 'Escritor',
111
+ roleWriterDesc: 'Você decide a palavra secreta.',
112
+ writerInputPrompt: 'Você é o Escritor. Introduza a palavra ou lugar secreto para este jogo:',
113
+ writerInputPlaceholder: 'ex. Restaurante, Hospital...',
114
+ btnSetWord: 'Salvar e Iniciar',
115
+ impostorWriterPreround: 'Ronda Prévia Secreta (Todos os jogadores)',
116
+ impostorWriterDescHost: 'O host não-jogador usa uma palavra aleatória.',
117
+ impostorWriterDescPreround: 'A ronda prévia permite que todos os jogadores escrevam palavras em segredo e escolhe uma aleatoriamente.',
118
+ impostorWriterDescPlayer: 'O jogador selecionado escreve a palavra e não pode ser impostor.',
119
+ preroundPassTitle: 'Ronda prévia: Passe o dispositivo para',
120
+ preroundInputPrompt: 'Escreva em segredo uma palavra ou lugar:',
121
+ preroundPassHint: 'Mantenha a palavra em segredo para os outros jogadores!',
122
+ btnSubmitWord: 'Enviar Palavra',
123
+ };
124
+
125
+ const faq = [
126
+ {
127
+ question: 'Como funciona o Distribuidor de Papéis Secretos?',
128
+ answer: 'O Distribuidor permite atribuir papéis para jogos de dedução social localmente em um único dispositivo. Introduz os nomes, escolhe um modelo ou personaliza papéis, e depois passa o dispositivo a cada jogador. O botão de revelação requer ser pressionado para mostrar o papel de forma privada.',
129
+ },
130
+ ];
131
+
132
+ const howTo = [
133
+ {
134
+ name: 'Adicionar Jogadores',
135
+ text: 'Insira os nomes dos participantes no painel de configuração.',
136
+ },
137
+ {
138
+ name: 'Selecionar Modelo',
139
+ text: 'Escolha um dos modelos de jogo prontos ou configure papéis personalizados.',
140
+ },
141
+ {
142
+ name: 'Passar e Revelar',
143
+ text: 'Passe o dispositivo para cada jogador. Cada jogador deve pressionar e segurar o botão de revelar para ver seu papel secreto, depois tocar em próximo.',
144
+ },
145
+ ];
146
+
147
+ export const content: ToolLocaleContent<HiddenRoleDealerUI> = {
148
+ slug: 'distribuidor-papeis-secretos-ocultos',
149
+ title: 'Distribuidor de Papéis Secretos: Cartas e Identidades Ocultas',
150
+ description: 'Distribua papéis secretos localmente para jogos de tabuleiro como Lobisomem, Avalon, Secret Hitler e Impostor sem cartas físicas.',
151
+ ui,
152
+ seo: [
153
+ { type: 'title', text: 'Equilíbrio de Equipas em Jogos de Dedução Social', level: 2 },
154
+ { type: 'paragraph', html: 'Ajustar a proporção de papéis de bem e mal é fundamental para uma partida competitiva.' },
155
+ ],
156
+ faq,
157
+ bibliography,
158
+ howTo,
159
+ schemas: [
160
+ {
161
+ '@context': 'https://schema.org',
162
+ '@type': 'FAQPage',
163
+ 'mainEntity': faq.map((f) => ({
164
+ '@type': 'Question',
165
+ 'name': f.question,
166
+ 'acceptedAnswer': {
167
+ '@type': 'Answer',
168
+ 'text': f.answer,
169
+ },
170
+ })),
171
+ },
172
+ {
173
+ '@context': 'https://schema.org',
174
+ '@type': 'SoftwareApplication',
175
+ 'name': ui.title,
176
+ 'operatingSystem': 'All',
177
+ 'applicationCategory': 'UtilitiesApplication',
178
+ 'browserRequirements': 'Requires HTML5. Requires JavaScript.',
179
+ },
180
+ {
181
+ '@context': 'https://schema.org',
182
+ '@type': 'HowTo',
183
+ 'name': ui.setupTitle,
184
+ 'step': howTo.map((h) => ({
185
+ '@type': 'HowToStep',
186
+ 'name': h.name,
187
+ 'text': h.text,
188
+ })),
189
+ },
190
+ ],
191
+ };
@@ -0,0 +1,191 @@
1
+ import { bibliography } from '../bibliography';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { HiddenRoleDealerUI } from '../entry';
4
+
5
+ const ui: HiddenRoleDealerUI = {
6
+ title: 'Раздача тайных ролей',
7
+ setupTitle: 'Настройка раздачи ролей',
8
+ playerList: 'Список игроков',
9
+ addPlayer: 'Добавить',
10
+ addPlayerPlaceholder: 'Имя игрока...',
11
+ rolePool: 'Пул тайных ролей',
12
+ presetsTitle: 'Шаблоны игр',
13
+ presetCustom: 'Пользовательская игра',
14
+ dealRoles: 'Раздать тайные роли',
15
+ clearPlayers: 'Очистить список',
16
+ instructions: 'Введите имена игроков, настройте тайные роли и нажмите «Раздать тайные роли».',
17
+ passTo: 'Передайте устройство',
18
+ holdToReveal: 'Удерживайте для просмотра',
19
+ releasingResets: 'Удерживайте нажатие для просмотра...',
20
+ hideRole: 'Понятно, скрыть роль',
21
+ nextPlayer: 'Следующий игрок',
22
+ finishedTitle: 'Все роли разданы',
23
+ finishedDesc: 'Все игроки тайно посмотрели свои роли. Вы можете начать игру.',
24
+ restart: 'Начать заново',
25
+ rolesCount: 'Выбрано ролей',
26
+ playersCount: 'Добавлено игроков',
27
+ mismatchWarning: 'Для раздачи ролей требуется не менее 3 игроков.',
28
+ werewolfName: 'Оборотень / Мафия',
29
+ werewolfDesc: 'Мирные жители пытаются вычислить и проголосовать против оборотней.',
30
+ avalonName: 'The Resistance: Avalon',
31
+ avalonDesc: 'Мерлин и верные слуги выполняют квесты, избегая саботажников.',
32
+ hitlerName: 'Secret Hitler',
33
+ hitlerDesc: 'Либералы пытаются принять законы и вычислить секретного лидера.',
34
+ customName: 'Пользовательская игра',
35
+ customDesc: 'Раздайте игрокам простые подписанные карты.',
36
+ roleWerewolfName: 'Оборотень',
37
+ roleWerewolfDesc: 'Тайно устраняйте мирных жителей ночью.',
38
+ roleWerewolfSecret: 'Сотрудничайте с другими оборотнями, чтобы обмануть деревню.',
39
+ roleSeerName: 'Провидец',
40
+ roleSeerDesc: 'Проверяйте фракцию одного игрока каждую ночь.',
41
+ roleSeerSecret: 'Вычисляйте оборотней, но не раскрывайте себя, чтобы выжить.',
42
+ roleDoctorName: 'Доктор',
43
+ roleDoctorDesc: 'Защищайте одного игрока от устранения каждую ночь.',
44
+ roleDoctorSecret: 'Спасайте ключевых жителей деревни.',
45
+ roleVillagerName: 'Житель',
46
+ roleVillagerDesc: 'Ищите скрытых оборотней.',
47
+ roleVillagerSecret: 'Обсуждайте, анализируйте и голосуйте против подозреваемых.',
48
+ roleMerlinName: 'Мерлин',
49
+ roleMerlinDesc: 'Знает агентов зла.',
50
+ roleMerlinSecret: 'Ведите команду к победе, не раскрывая своей личности.',
51
+ roleAssassinName: 'Ассасин',
52
+ roleAssassinDesc: 'Может убить Мерлина в конце игры.',
53
+ roleAssassinSecret: 'Найдите Мерлина, чтобы вырвать победу в последний момент.',
54
+ roleMinionName: 'Приспешник Мордреда',
55
+ roleMinionDesc: 'Информированный агент зла.',
56
+ roleMinionSecret: 'Саботируйте квесты, оставаясь незамеченным.',
57
+ roleServantName: 'Верный слуга',
58
+ roleServantDesc: 'Выполняйте квесты короля Артура.',
59
+ roleServantSecret: 'Обсуждайте, предлагайте составы команд и голосуйте логично.',
60
+ roleHitlerName: 'Гитлер',
61
+ roleHitlerDesc: 'Секретный лидер фашистов.',
62
+ roleHitlerSecret: 'Добейтесь избрания канцлером или помогите принять законы.',
63
+ roleFascistName: 'Фашист',
64
+ roleFascistDesc: 'Сотрудничайте для принятия фашистских законов.',
65
+ roleFascistSecret: 'Защищайте Гитлера и манипулируйте выборами.',
66
+ roleLiberalName: 'Либерал',
67
+ roleLiberalDesc: 'Найдите и остановите фашистскую угрозу.',
68
+ roleLiberalSecret: 'Принимайте либеральные законы и устраните Гитлера при возможности.',
69
+ roleCustomName: 'Своя роль',
70
+ roleCustomDesc: 'Общее описание своей роли.',
71
+ roleCustomSecret: 'Выполните цель вашей команды.',
72
+ teamWerewolves: 'Оборотни',
73
+ teamVillagers: 'Мирные жители',
74
+ teamGood: 'Добро',
75
+ teamEvil: 'Зло',
76
+ teamFascist: 'Фашисты',
77
+ teamLiberal: 'Либералы',
78
+ teamCustom: 'Своя команда',
79
+ secretRoleIs: 'ваша тайная роль:',
80
+ customRolesTitle: 'Настройка своих ролей',
81
+ customRolePlaceholder: 'Название роли...',
82
+ neutralLabel: 'Нейтрал',
83
+ goodLabel: 'Добро',
84
+ evilLabel: 'Зло',
85
+ customMismatchWarning: 'Настройте ровно столько же своих ролей, сколько игроков.',
86
+ impostorPresetName: 'Игра Предатель',
87
+ impostorPresetDesc: 'Раздайте роли предателей и членов экипажа с гибкой настройкой количества.',
88
+ impostorTitle: 'Настройки Предателя',
89
+ impostorWarning: 'Количество игроков должно быть больше количества предателей.',
90
+ roleImpostorName: 'Предатель',
91
+ roleImpostorDesc: 'Тайно устраняйте членов экипажа.',
92
+ roleImpostorSecret: 'Саботируйте и устраняйте, не давая себя поймать.',
93
+ roleCrewmateName: 'Член экипажа',
94
+ roleCrewmateDesc: 'Выполняйте задания и найдите предателя.',
95
+ roleCrewmateSecret: 'Секретное слово:',
96
+ teamImpostor: 'Предатель',
97
+ teamCrewmate: 'Экипаж',
98
+ impostorSharedSecretLabel: 'Общее секретное слово',
99
+ impostorSharedSecretPlaceholder: 'например Локация: Ресторан, или Слово: Яблоко',
100
+ impostorModeLabel: 'Режим расчета предателей',
101
+ impostorModeFixed: 'Фиксированное количество',
102
+ impostorModePercentage: 'Процент (%)',
103
+ impostorModeRange: 'Случайный диапазон',
104
+ impostorFixedLabel: 'Количество предателей',
105
+ impostorPercentageLabel: 'Процент предателей (%)',
106
+ impostorRangeMinLabel: 'Минимум предателей',
107
+ impostorRangeMaxLabel: 'Максимум предателей',
108
+ impostorWriterLabel: 'Автор слова / Ведущий',
109
+ impostorWriterRandom: 'Ведущий вне игры',
110
+ roleWriterName: 'Автор слова',
111
+ roleWriterDesc: 'Вы придумываете секретное слово.',
112
+ writerInputPrompt: 'Вы автор слова. Введите секретное слово или локацию для этой партии:',
113
+ writerInputPlaceholder: 'например Ресторан, Больница...',
114
+ btnSetWord: 'Сохранить и начать',
115
+ impostorWriterPreround: 'Секретный пред-раунд (Все игроки)',
116
+ impostorWriterDescHost: 'Ведущий вне игры использует случайное слово.',
117
+ impostorWriterDescPreround: 'Пред-раунд позволяет всем игрокам тайно ввести слова, после чего одно из них выбирается случайно.',
118
+ impostorWriterDescPlayer: 'Выбранный игрок пишет слово и не может быть предателем.',
119
+ preroundPassTitle: 'Пред-раунд: Передайте устройство',
120
+ preroundInputPrompt: 'Тайно введите слово или локацию (будет скрыто):',
121
+ preroundPassHint: 'Держите слово в секрете от других игроков!',
122
+ btnSubmitWord: 'Отправить слово',
123
+ };
124
+
125
+ const faq = [
126
+ {
127
+ question: 'Как работает Раздача тайных ролей?',
128
+ answer: 'Этот инструмент позволяет локально на одном устройстве раздать секретные роли для салонных детективных игр. Вы вводите имена, выбираете шаблон и по очереди передаете устройство. Каждый игрок зажимает кнопку просмотра, чтобы тайно прочитать свою роль.',
129
+ },
130
+ ];
131
+
132
+ const howTo = [
133
+ {
134
+ name: 'Добавить игроков',
135
+ text: 'Введите имена участников на панели настройки.',
136
+ },
137
+ {
138
+ name: 'Выбрать шаблон',
139
+ text: 'Выберите один из готовых пресетов или настройте свой пул ролей.',
140
+ },
141
+ {
142
+ name: 'Передайте и раскройте',
143
+ text: 'Передайте устройство каждому игроку. Каждый игрок должен нажать и удерживать кнопку раскрытия, чтобы увидеть свою секретную роль, а затем нажать кнопку "Далее".',
144
+ },
145
+ ];
146
+
147
+ export const content: ToolLocaleContent<HiddenRoleDealerUI> = {
148
+ slug: 'razdacha-taynyh-roley-mafiya',
149
+ title: 'Раздача тайных ролей: Раздатчик ролей для мафии и настольных игр',
150
+ description: 'Раздавайте секретные роли локально для мафии, оборотня, авалон, секретного гитлера и предателя без физических карт на одном смартфоне.',
151
+ ui,
152
+ seo: [
153
+ { type: 'title', text: 'Баланс фракций в разговорных детективных играх', level: 2 },
154
+ { type: 'paragraph', html: 'Корректный баланс сил добра и зла крайне важен для обеспечения интересного и соревновательного процесса.' },
155
+ ],
156
+ faq,
157
+ bibliography,
158
+ howTo,
159
+ schemas: [
160
+ {
161
+ '@context': 'https://schema.org',
162
+ '@type': 'FAQPage',
163
+ 'mainEntity': faq.map((f) => ({
164
+ '@type': 'Question',
165
+ 'name': f.question,
166
+ 'acceptedAnswer': {
167
+ '@type': 'Answer',
168
+ 'text': f.answer,
169
+ },
170
+ })),
171
+ },
172
+ {
173
+ '@context': 'https://schema.org',
174
+ '@type': 'SoftwareApplication',
175
+ 'name': ui.title,
176
+ 'operatingSystem': 'All',
177
+ 'applicationCategory': 'UtilitiesApplication',
178
+ 'browserRequirements': 'Requires HTML5. Requires JavaScript.',
179
+ },
180
+ {
181
+ '@context': 'https://schema.org',
182
+ '@type': 'HowTo',
183
+ 'name': ui.setupTitle,
184
+ 'step': howTo.map((h) => ({
185
+ '@type': 'HowToStep',
186
+ 'name': h.name,
187
+ 'text': h.text,
188
+ })),
189
+ },
190
+ ],
191
+ };
@@ -0,0 +1,191 @@
1
+ import { bibliography } from '../bibliography';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { HiddenRoleDealerUI } from '../entry';
4
+
5
+ const ui: HiddenRoleDealerUI = {
6
+ title: 'Hemlig Rollfördelare',
7
+ setupTitle: 'Konfiguration för Rollfördelning',
8
+ playerList: 'Spelarlista',
9
+ addPlayer: 'Lägg till',
10
+ addPlayerPlaceholder: 'Spelarnamn...',
11
+ rolePool: 'Hemlig Rollpool',
12
+ presetsTitle: 'Spelmallar',
13
+ presetCustom: 'Anpassad Inställning',
14
+ dealRoles: 'Fördela Hemliga Roller',
15
+ clearPlayers: 'Rensa Alla',
16
+ instructions: 'Skriv in spelarnamnen, konfigurera de hemliga rollerna och tryck på Fördela Hemliga Roller.',
17
+ passTo: 'Skicka enheten till',
18
+ holdToReveal: 'Håll för att visa',
19
+ releasingResets: 'Fortsätt hålla för att visa...',
20
+ hideRole: 'Uppfattat, dölj roll',
21
+ nextPlayer: 'Nästa Spelare',
22
+ finishedTitle: 'Alla Roller Fördelade',
23
+ finishedDesc: 'Alla spelare har i hemlighet granskat sina roller. Ni kan nu starta spelet.',
24
+ restart: 'Starta om och Fördela igen',
25
+ rolesCount: 'Valda Roller',
26
+ playersCount: 'Tillagda Spelare',
27
+ mismatchWarning: 'Minst 3 spelare krävs för att fördela roller.',
28
+ werewolfName: 'Varulv / Mafia',
29
+ werewolfDesc: 'Byborna försöker hitta och rösta ut dolda Varulvar.',
30
+ avalonName: 'The Resistance: Avalon',
31
+ avalonDesc: 'Merlin och trogna tjänare slutför uppdrag och undviker sabotörer.',
32
+ hitlerName: 'Secret Hitler',
33
+ hitlerDesc: 'Liberalerna försöker stifta lagar och hitta den hemliga ledaren.',
34
+ customName: 'Anpassad Inställning',
35
+ customDesc: 'Fördela enkla namngivna kort till spelarna.',
36
+ roleWerewolfName: 'Varulv',
37
+ roleWerewolfDesc: 'Eliminera i hemlighet Bybor under natten.',
38
+ roleWerewolfSecret: 'Samarbeta med andra Varulvar för att lura byn.',
39
+ roleSeerName: 'Siare',
40
+ roleSeerDesc: 'Kontrollera en spelares tillhörighet varje natt.',
41
+ roleSeerSecret: 'Hitta Varulvarna men håll dig dold för att överleva.',
42
+ roleDoctorName: 'Doktor',
43
+ roleDoctorDesc: 'Skydda en spelare från eliminering varje natt.',
44
+ roleDoctorSecret: 'Håll viktiga bybor vid liv.',
45
+ roleVillagerName: 'Bybo',
46
+ roleVillagerDesc: 'Hitta de dolda Varulvarna.',
47
+ roleVillagerSecret: 'Diskutera, analysera och rösta på misstänkta spelare.',
48
+ roleMerlinName: 'Merlin',
49
+ roleMerlinDesc: 'Känner till ondskans agenter.',
50
+ roleMerlinSecret: 'Led laget till seger utan att avslöja dig själv.',
51
+ roleAssassinName: 'Lönnmördare',
52
+ roleAssassinDesc: 'Kan lönnmörda Merlin i slutet av spelet.',
53
+ roleAssassinSecret: 'Hitta Merlin för att stjäla segern i slutet.',
54
+ roleMinionName: 'Mordreds Tjänare',
55
+ roleMinionDesc: 'Informerad agent för Mordred.',
56
+ roleMinionSecret: 'Sabotera uppdrag utan att bli upptäckt.',
57
+ roleServantName: 'Trogen Tjänare',
58
+ roleServantDesc: 'Slutför uppdrag för Arthur.',
59
+ roleServantSecret: 'Diskutera, föreslå lag och rösta logiskt.',
60
+ roleHitlerName: 'Hitler',
61
+ roleHitlerDesc: 'Fascisternas hemliga ledare.',
62
+ roleHitlerSecret: 'Bli vald till förbundskansler eller låt Fascisterna stifta lagar.',
63
+ roleFascistName: 'Fascist',
64
+ roleFascistDesc: 'Samarbeta för att stifta fascistiska lagar.',
65
+ roleFascistSecret: 'Skydda Hitler och manipulera valresultaten.',
66
+ roleLiberalName: 'Liberal',
67
+ roleLiberalDesc: 'Hitta och stoppa det fascistiska hotet.',
68
+ roleLiberalSecret: 'Stifta liberala lagar och eliminera Hitler om möjligt.',
69
+ roleCustomName: 'Anpassad Roll',
70
+ roleCustomDesc: 'Allmän beskrivning av den anpassade rollen.',
71
+ roleCustomSecret: 'Uppfyll ditt lagmål.',
72
+ teamWerewolves: 'Varulvar',
73
+ teamVillagers: 'Bybor',
74
+ teamGood: 'God',
75
+ teamEvil: 'Ond',
76
+ teamFascist: 'Fascist',
77
+ teamLiberal: 'Liberal',
78
+ teamCustom: 'Anpassat Lag',
79
+ secretRoleIs: 'din hemliga roll är:',
80
+ customRolesTitle: 'Konfiguration för Anpassade Roller',
81
+ customRolePlaceholder: 'Skriv rollnamn...',
82
+ neutralLabel: 'Neutral',
83
+ goodLabel: 'God',
84
+ evilLabel: 'Ond',
85
+ customMismatchWarning: 'Konfigurera exakt lika många anpassade roller som spelare.',
86
+ impostorPresetName: 'Impostor-spel',
87
+ impostorPresetDesc: 'Fördela Impostor- och Crewmate-roller med anpassningsbara antal.',
88
+ impostorTitle: 'Inställningar för Impostor',
89
+ impostorWarning: 'Du behöver fler spelare än impostorer.',
90
+ roleImpostorName: 'Impostor',
91
+ roleImpostorDesc: 'Eliminera besättningsmedlemmar i hemlighet.',
92
+ roleImpostorSecret: 'Sabotera och eliminera utan att bli upptäckt.',
93
+ roleCrewmateName: 'Crewmate',
94
+ roleCrewmateDesc: 'Slutför uppgifter och hitta Impostorn.',
95
+ roleCrewmateSecret: 'Det hemliga ordet är:',
96
+ teamImpostor: 'Impostor',
97
+ teamCrewmate: 'Crewmate',
98
+ impostorSharedSecretLabel: 'Delat Hemligt Ord',
99
+ impostorSharedSecretPlaceholder: 't.ex. Plats: Restaurang, eller Ord: Äpple',
100
+ impostorModeLabel: 'Beräkningsläge för Impostorer',
101
+ impostorModeFixed: 'Fast Antal',
102
+ impostorModePercentage: 'Procent (%)',
103
+ impostorModeRange: 'Slumpmässigt Intervall',
104
+ impostorFixedLabel: 'Antal Impostorer',
105
+ impostorPercentageLabel: 'Impostor-procent (%)',
106
+ impostorRangeMinLabel: 'Minsta Antal Impostorer',
107
+ impostorRangeMaxLabel: 'Högsta Antal Impostorer',
108
+ impostorWriterLabel: 'Ordförfattare / Host',
109
+ impostorWriterRandom: 'Icke-spelande värd',
110
+ roleWriterName: 'Författare',
111
+ roleWriterDesc: 'Du bestämmer det hemliga ordet.',
112
+ writerInputPrompt: 'Du är författaren. Skriv det hemliga ordet eller platsen för det här spelet:',
113
+ writerInputPlaceholder: 't.ex. Restaurang, Sjukhus...',
114
+ btnSetWord: 'Spara ord & Starta',
115
+ impostorWriterPreround: 'Hemlig Förrunda (Alla spelare)',
116
+ impostorWriterDescHost: 'Den icke-spelande värden använder ett slumpmässigt ord.',
117
+ impostorWriterDescPreround: 'Förrundan låter alla spelare skriva ord i hemlighet och väljer sedan slumpmässigt ett av dem.',
118
+ impostorWriterDescPlayer: 'Den valda spelaren skriver ordet och kan inte bli impostor.',
119
+ preroundPassTitle: 'Förrunda: Skicka enheten till',
120
+ preroundInputPrompt: 'Skriv i hemlighet ett ord eller en plats:',
121
+ preroundPassHint: 'Håll ordet hemligt för andra spelare!',
122
+ btnSubmitWord: 'Skicka ord',
123
+ };
124
+
125
+ const faq = [
126
+ {
127
+ question: 'Hur fungerar den Hemliga Rollfördelaren?',
128
+ answer: 'Verktyget gör det möjligt att fördela hemliga roller för social deduction-spel lokalt på en enhet. Du skriver in spelarnas namn, väljer en mall eller anpassar rollerna, och skickar sedan enheten vidare. Varje spelare håller in visningsknappen för att se sin roll privat.',
129
+ },
130
+ ];
131
+
132
+ const howTo = [
133
+ {
134
+ name: 'Lägg till Spelare',
135
+ text: 'Skriv in deltagarnas namn i inställningspanelen.',
136
+ },
137
+ {
138
+ name: 'Välj Mall',
139
+ text: 'Välj en inbyggd spelregel eller konfigurera en egen rollpool.',
140
+ },
141
+ {
142
+ name: 'Skicka och visa',
143
+ text: 'Skicka enheten till varje spelare. Varje spelare måste hålla in knappen för att visa sin hemliga roll, och sedan klicka på nästa.',
144
+ },
145
+ ];
146
+
147
+ export const content: ToolLocaleContent<HiddenRoleDealerUI> = {
148
+ slug: 'hemlig-rollfordelare-roller',
149
+ title: 'Hemlig Rollfördelare: Spelkortsutdelare & Identitetsfördelare',
150
+ description: 'Fördela hemliga roller lokalt för sällskapsspel som Varulv, Avalon, Secret Hitler och Impostor utan fysiska kort.',
151
+ ui,
152
+ seo: [
153
+ { type: 'title', text: 'Teambalans i Social Deduction-spel', level: 2 },
154
+ { type: 'paragraph', html: 'Att justera förhållandet mellan goda och onda roller är grundläggande för en rättvis och spännande spelupplevelse.' },
155
+ ],
156
+ faq,
157
+ bibliography,
158
+ howTo,
159
+ schemas: [
160
+ {
161
+ '@context': 'https://schema.org',
162
+ '@type': 'FAQPage',
163
+ 'mainEntity': faq.map((f) => ({
164
+ '@type': 'Question',
165
+ 'name': f.question,
166
+ 'acceptedAnswer': {
167
+ '@type': 'Answer',
168
+ 'text': f.answer,
169
+ },
170
+ })),
171
+ },
172
+ {
173
+ '@context': 'https://schema.org',
174
+ '@type': 'SoftwareApplication',
175
+ 'name': ui.title,
176
+ 'operatingSystem': 'All',
177
+ 'applicationCategory': 'UtilitiesApplication',
178
+ 'browserRequirements': 'Requires HTML5. Requires JavaScript.',
179
+ },
180
+ {
181
+ '@context': 'https://schema.org',
182
+ '@type': 'HowTo',
183
+ 'name': ui.setupTitle,
184
+ 'step': howTo.map((h) => ({
185
+ '@type': 'HowToStep',
186
+ 'name': h.name,
187
+ 'text': h.text,
188
+ })),
189
+ },
190
+ ],
191
+ };