@jjlmoya/utils-tabletop 1.20.0 → 1.22.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.
- package/package.json +1 -1
- package/src/category/index.ts +2 -0
- package/src/entries.ts +4 -0
- package/src/index.ts +1 -0
- package/src/tests/locale_completeness.test.ts +1 -1
- package/src/tests/seo_translation_completeness.test.ts +69 -0
- package/src/tests/spanish_leakage.test.ts +25 -3
- package/src/tests/tool_validation.test.ts +1 -1
- package/src/tool/decision-wheel/i18n/de.ts +10 -10
- package/src/tool/decision-wheel/i18n/es.ts +10 -10
- package/src/tool/decision-wheel/i18n/fr.ts +10 -10
- package/src/tool/decision-wheel/i18n/id.ts +10 -10
- package/src/tool/decision-wheel/i18n/it.ts +10 -10
- package/src/tool/decision-wheel/i18n/ja.ts +10 -10
- package/src/tool/decision-wheel/i18n/ko.ts +10 -10
- package/src/tool/decision-wheel/i18n/nl.ts +10 -10
- package/src/tool/decision-wheel/i18n/pl.ts +10 -10
- package/src/tool/decision-wheel/i18n/pt.ts +10 -10
- package/src/tool/decision-wheel/i18n/sv.ts +10 -10
- package/src/tool/decision-wheel/i18n/tr.ts +10 -10
- package/src/tool/decision-wheel/i18n/zh.ts +10 -10
- package/src/tool/dungeon-map-generator/bibliography.astro +16 -0
- package/src/tool/dungeon-map-generator/bibliography.ts +12 -0
- package/src/tool/dungeon-map-generator/component.astro +134 -0
- package/src/tool/dungeon-map-generator/controller.ts +242 -0
- package/src/tool/dungeon-map-generator/document.ts +72 -0
- package/src/tool/dungeon-map-generator/dom-views.ts +139 -0
- package/src/tool/dungeon-map-generator/editor.ts +57 -0
- package/src/tool/dungeon-map-generator/entry.ts +28 -0
- package/src/tool/dungeon-map-generator/evaluator.ts +40 -0
- package/src/tool/dungeon-map-generator/i18n/de.ts +172 -0
- package/src/tool/dungeon-map-generator/i18n/en.ts +172 -0
- package/src/tool/dungeon-map-generator/i18n/es.ts +172 -0
- package/src/tool/dungeon-map-generator/i18n/fr.ts +172 -0
- package/src/tool/dungeon-map-generator/i18n/id.ts +172 -0
- package/src/tool/dungeon-map-generator/i18n/it.ts +172 -0
- package/src/tool/dungeon-map-generator/i18n/ja.ts +172 -0
- package/src/tool/dungeon-map-generator/i18n/ko.ts +172 -0
- package/src/tool/dungeon-map-generator/i18n/nl.ts +172 -0
- package/src/tool/dungeon-map-generator/i18n/pl.ts +172 -0
- package/src/tool/dungeon-map-generator/i18n/pt.ts +172 -0
- package/src/tool/dungeon-map-generator/i18n/ru.ts +172 -0
- package/src/tool/dungeon-map-generator/i18n/sv.ts +172 -0
- package/src/tool/dungeon-map-generator/i18n/tr.ts +172 -0
- package/src/tool/dungeon-map-generator/i18n/zh.ts +172 -0
- package/src/tool/dungeon-map-generator/index.ts +11 -0
- package/src/tool/dungeon-map-generator/logic.test.ts +75 -0
- package/src/tool/dungeon-map-generator/logic.ts +255 -0
- package/src/tool/dungeon-map-generator/random-dungeon-map-generator.css +678 -0
- package/src/tool/dungeon-map-generator/seo.astro +16 -0
- package/src/tool/dungeon-map-generator/storage.ts +18 -0
- package/src/tool/dungeon-map-generator/ui.ts +53 -0
- package/src/tool/dungeon-map-generator/validation.ts +40 -0
- package/src/tool/hidden-role-dealer/i18n/de.ts +6 -6
- package/src/tool/hidden-role-dealer/i18n/id.ts +6 -6
- package/src/tool/hidden-role-dealer/i18n/it.ts +6 -6
- package/src/tool/hidden-role-dealer/i18n/ja.ts +6 -6
- package/src/tool/hidden-role-dealer/i18n/ko.ts +6 -6
- package/src/tool/hidden-role-dealer/i18n/nl.ts +6 -6
- package/src/tool/hidden-role-dealer/i18n/pl.ts +7 -7
- package/src/tool/hidden-role-dealer/i18n/pt.ts +7 -7
- package/src/tool/hidden-role-dealer/i18n/ru.ts +7 -7
- package/src/tool/hidden-role-dealer/i18n/sv.ts +7 -7
- package/src/tool/hidden-role-dealer/i18n/tr.ts +7 -7
- package/src/tool/hidden-role-dealer/i18n/zh.ts +9 -9
- package/src/tool/scatter-direction-selector/i18n/de.ts +9 -9
- package/src/tool/scatter-direction-selector/i18n/es.ts +9 -9
- package/src/tool/scatter-direction-selector/i18n/fr.ts +12 -12
- package/src/tool/scatter-direction-selector/i18n/id.ts +9 -9
- package/src/tool/scatter-direction-selector/i18n/it.ts +11 -11
- package/src/tool/scatter-direction-selector/i18n/ja.ts +8 -8
- package/src/tool/scatter-direction-selector/i18n/ko.ts +8 -8
- package/src/tool/scatter-direction-selector/i18n/nl.ts +9 -10
- package/src/tool/scatter-direction-selector/i18n/pl.ts +9 -9
- package/src/tool/scatter-direction-selector/i18n/pt.ts +12 -12
- package/src/tool/scatter-direction-selector/i18n/ru.ts +7 -7
- package/src/tool/scatter-direction-selector/i18n/sv.ts +9 -9
- package/src/tool/scatter-direction-selector/i18n/tr.ts +8 -8
- package/src/tool/scatter-direction-selector/i18n/zh.ts +11 -11
- package/src/tools.ts +2 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
3
|
+
import type { DungeonMapGeneratorLocaleContent, DungeonMapGeneratorUI } from '../entry';
|
|
4
|
+
|
|
5
|
+
const ui: DungeonMapGeneratorUI = {
|
|
6
|
+
intro: 'Elige una semilla, ajusta la cuadrícula y selecciona el estilo arquitectónico. Genera un mapa conectado para tus notas, impresión o tablero virtual.',
|
|
7
|
+
seedLabel: 'Semilla del mapa',
|
|
8
|
+
seedHint: 'Reutiliza la misma semilla con la misma configuración para recrear exactamente el mismo mapa.',
|
|
9
|
+
randomSeed: 'Nueva semilla',
|
|
10
|
+
sizeLabel: 'Tamaño de expedición',
|
|
11
|
+
sizeCompact: 'Una sesión (One shot)',
|
|
12
|
+
sizeSession: 'Sesión',
|
|
13
|
+
sizeStronghold: 'Fortaleza',
|
|
14
|
+
fineTuneGrid: 'Ajuste fino de cuadrícula y densidad',
|
|
15
|
+
columnsLabel: 'Columnas',
|
|
16
|
+
rowsLabel: 'Filas',
|
|
17
|
+
densityLabel: 'Densidad de salas',
|
|
18
|
+
densityHint: 'Una mayor densidad añade más salas y superficie transitable.',
|
|
19
|
+
styleLabel: 'Arquitectura del mapa',
|
|
20
|
+
dungeonStyle: 'Mazmorra',
|
|
21
|
+
dungeonStyleHint: 'Salas de piedra con pasillos de ancho simple.',
|
|
22
|
+
cavernStyle: 'Cueva',
|
|
23
|
+
cavernStyleHint: 'Cámaras irregulares con bordes suavizados.',
|
|
24
|
+
scifiStyle: 'Ciencia Ficción',
|
|
25
|
+
scifiStyleHint: 'Módulos amplios con conectores de doble anchura.',
|
|
26
|
+
generate: 'Dibujar este mapa',
|
|
27
|
+
mapRegionLabel: 'Mapa de mazmorra generado y controles de exportación',
|
|
28
|
+
connectedBadge: 'Todas las salas conectadas',
|
|
29
|
+
roomsLabel: 'Salas',
|
|
30
|
+
doorsLabel: 'Puertas',
|
|
31
|
+
floorLabel: 'Cobertura de suelo',
|
|
32
|
+
legendFloor: 'Suelo transitable',
|
|
33
|
+
legendWall: 'Muro sólido',
|
|
34
|
+
legendDoor: 'Puerta o escotilla',
|
|
35
|
+
editHint: 'Clic derecho en una celda para editar',
|
|
36
|
+
editCell: 'Editar esta celda',
|
|
37
|
+
paintFloor: 'Suelo',
|
|
38
|
+
paintWall: 'Muro',
|
|
39
|
+
paintDoor: 'Puerta',
|
|
40
|
+
mapData: 'Datos del mapa',
|
|
41
|
+
copyLink: 'Copiar enlace al mapa',
|
|
42
|
+
linkCopied: 'Enlace copiado',
|
|
43
|
+
exportPng: 'Descargar PNG',
|
|
44
|
+
exportSvg: 'Descargar SVG',
|
|
45
|
+
exportJson: 'Guardar JSON',
|
|
46
|
+
importJson: 'Abrir JSON',
|
|
47
|
+
importError: 'Este archivo no contiene una configuración válida de mapa de mazmorra.',
|
|
48
|
+
compactMap: 'Exploración tensa',
|
|
49
|
+
balancedMap: 'Expedición equilibrada',
|
|
50
|
+
sprawlingMap: 'Fortaleza abierta',
|
|
51
|
+
compactHint: 'Pasadizos más largos dejan más espacio desconocido entre salas.',
|
|
52
|
+
balancedHint: 'Salas y pasillos comparten la distribución sin aglomeraciones.',
|
|
53
|
+
sprawlingHint: 'Mayor cobertura de suelo favorece los encuentros y el movimiento rápido.',
|
|
54
|
+
mapReady: 'Leyenda del mapa',
|
|
55
|
+
dimensionsUnit: 'celdas de cuadrícula',
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const faq = [
|
|
59
|
+
{
|
|
60
|
+
question: '¿La misma semilla siempre crea el mismo mapa de mazmorra?',
|
|
61
|
+
answer: 'Sí. La semilla, las dimensiones de la cuadrícula, la densidad y el estilo forman una configuración determinista. Reutilizar los cuatro parámetros vuelve a generar exactamente las mismas salas, pasillos y puertas.',
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
question: '¿Todas las salas generadas son accesibles entre sí?',
|
|
65
|
+
answer: 'Sí. Las salas se conectan mediante una ruta principal tras su colocación, garantizando que cada región transitable pertenezca a un único mapa conectado.',
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
question: '¿Qué cambia entre los estilos mazmorra, cueva y ciencia ficción?',
|
|
69
|
+
answer: 'El estilo mazmorra usa salas cuadradas de piedra y pasillos estrechos. Las cuevas crean cámaras irregulares y redondeadas. El estilo ciencia ficción utiliza módulos amplios con pasillos dobles.',
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
question: '¿Qué formato debo exportar para un tablero virtual (VTT)?',
|
|
73
|
+
answer: 'PNG es la opción más sencilla para la mayoría de tableros virtuales. SVG se mantiene nítido a cualquier escala y es fácil de editar en programas vectoriales. Ambos respetan la cuadrícula cuadrada.',
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
question: '¿Otra persona puede regenerar mi mapa de mazmorra aleatorio?',
|
|
77
|
+
answer: 'Sí. Copia el enlace del mapa para incluir la configuración completa en la URL o envía el archivo JSON. El destinatario podrá cargar el mismo mapa de forma inmediata.',
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
question: '¿Este generador añade monstruos, trampas o tesoros?',
|
|
81
|
+
answer: 'No. Crea un plano arquitectónico neutro para que puedas adaptarlo a cualquier sistema de juego. El diseño de encuentros, secretos y peligros queda a discreción del director de juego.',
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
|
|
85
|
+
const howTo = [
|
|
86
|
+
{
|
|
87
|
+
name: 'Ajusta las dimensiones',
|
|
88
|
+
text: 'Elige el número de columnas y filas para adaptar el mapa a tus notas, página impresa o escena de tablero virtual.',
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
name: 'Selecciona la arquitectura',
|
|
92
|
+
text: 'Elige entre mazmorra, cueva o ciencia ficción, y ajusta la densidad de salas según el tipo de exploración deseado.',
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
name: 'Genera e inspecciona',
|
|
96
|
+
text: 'Introduce una semilla o genera una aleatoria, dibuja el mapa y revisa la métrica de salas, puertas y cobertura de suelo.',
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'Exporta o comparte',
|
|
100
|
+
text: 'Descarga el mapa en PNG o SVG para jugar, o guarda la configuración mediante un enlace o archivo JSON.',
|
|
101
|
+
},
|
|
102
|
+
];
|
|
103
|
+
|
|
104
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
105
|
+
'@context': 'https://schema.org',
|
|
106
|
+
'@type': 'FAQPage',
|
|
107
|
+
mainEntity: faq.map((item) => ({
|
|
108
|
+
'@type': 'Question',
|
|
109
|
+
name: item.question,
|
|
110
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
111
|
+
})),
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
115
|
+
'@context': 'https://schema.org',
|
|
116
|
+
'@type': 'SoftwareApplication',
|
|
117
|
+
name: 'Generador de Mapas de Mazmorras Aleatorios',
|
|
118
|
+
operatingSystem: 'All',
|
|
119
|
+
applicationCategory: 'UtilitiesApplication',
|
|
120
|
+
description: 'Un generador determinista de mapas de mazmorras aleatorios con salas conectadas, pasillos, puertas y exportaciones locales.',
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
const howToSchema: WithContext<HowTo> = {
|
|
124
|
+
'@context': 'https://schema.org',
|
|
125
|
+
'@type': 'HowTo',
|
|
126
|
+
name: 'Cómo generar un mapa de mazmorra conectado',
|
|
127
|
+
step: howTo.map((item) => ({
|
|
128
|
+
'@type': 'HowToStep',
|
|
129
|
+
name: item.name,
|
|
130
|
+
text: item.text,
|
|
131
|
+
})),
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
export const content: DungeonMapGeneratorLocaleContent = {
|
|
135
|
+
slug: 'generador-mapas-mazmorras-aleatorios',
|
|
136
|
+
title: 'Generador de Mapas de Mazmorras Aleatorios para Juegos de Rol',
|
|
137
|
+
description: 'Crea mapas reproducibles de mazmorras, cuevas y ciencia ficción con salas conectadas, puertas y exportación PNG o SVG.',
|
|
138
|
+
ui,
|
|
139
|
+
seo: [
|
|
140
|
+
{ type: 'title', text: 'Genera un Mapa de Mazmorra Jugable mediante una Semilla Reutilizable', level: 2 },
|
|
141
|
+
{ type: 'paragraph', html: 'Un generador de mapas de mazmorras aleatorios necesita ir más allá del ruido visual aleatorio. Cada cámara debe ser alcanzable mediante pasillos conectados, la cuadrícula debe adaptarse a la superficie de juego y el resultado debe poder recuperarse en cualquier momento. Este generador trata la semilla y los controles como una especificación de mapa compacta y determinista. Mantener la misma semilla, filas, columnas y estilo garantiza reconstruir exactamente la misma estructura más adelante.' },
|
|
142
|
+
{ type: 'title', text: 'Dimensiones de Cuadrícula para Impresión y Tableros Virtuales', level: 2 },
|
|
143
|
+
{ type: 'paragraph', html: 'Configurar el tamaño de la cuadrícula es el primer paso práctico. Una cuadrícula pequeña es fácil de imprimir en papel y resulta ideal para aventuras cortas, mientras que un mapa amplio deja espacio para exploración compleja y múltiples facciones. La imagen exportada mantiene celdas perfectamente cuadradas para alinearse sin esfuerzo con la rejilla de cualquier software de tablero virtual (VTT).' },
|
|
144
|
+
{
|
|
145
|
+
type: 'table',
|
|
146
|
+
headers: ['Tamaño de cuadrícula', 'Uso recomendado', 'Densidad inicial', 'Nota de planificación'],
|
|
147
|
+
rows: [
|
|
148
|
+
['20 por 16 celdas', 'Aventura rápida o One shot', '35 a 45', 'Fácil de imprimir y rápida lectura visual'],
|
|
149
|
+
['36 por 26 celdas', 'Mazmorra de sesión', '45 a 55', 'Ritmo equilibrado entre salas y pasillos'],
|
|
150
|
+
['52 por 38 celdas', 'Complejo multisesión', '50 a 65', 'Espacio amplio para facciones y rutas optativas'],
|
|
151
|
+
],
|
|
152
|
+
},
|
|
153
|
+
{ type: 'tip', title: 'Adapta el Mapa a la Escala de Encuentro', html: 'Calcula las celdas necesarias para tus combates o escenas principales antes de fijar el tamaño. Una mazmorra grande con salas minúsculas se sentirá claustrofóbica, mientras que una distribución compacta con una sala central amplia favorece escenas memorables.' },
|
|
154
|
+
{ type: 'title', text: 'Interpreta la Cobertura de Suelo como Ritmo de Juego', level: 2 },
|
|
155
|
+
{ type: 'paragraph', html: 'La Cobertura de suelo indica qué porcentaje del lienzo rectangular representa espacio transitable. Una cobertura baja acentúa el espacio desconocido y la tensión del viaje entre salas. Una cobertura media ofrece una exploración fluida y estándar. Una cobertura elevada crea complejos fortificados donde los combates y patrullas pueden extenderse entre salas contiguas.' },
|
|
156
|
+
{
|
|
157
|
+
type: 'list',
|
|
158
|
+
items: [
|
|
159
|
+
'<strong>Exploración tensa:</strong> aprovecha las zonas vacías para sugerir aislamiento o pasajes secretos.',
|
|
160
|
+
'<strong>Expedición equilibrada:</strong> alterna salas de investigación con pasadizos de conexión e intercambios de combate.',
|
|
161
|
+
'<strong>Fortaleza abierta:</strong> diseña líneas de visión claras, patrullas enemigas y encuentros interconectados.',
|
|
162
|
+
],
|
|
163
|
+
},
|
|
164
|
+
{ type: 'title', text: 'Transforma un Plano Neutro en una Localización de Aventura', level: 2 },
|
|
165
|
+
{ type: 'paragraph', html: 'El mapa generado proporciona únicamente la arquitectura de base. Asigna una función narrativa a cada sala clave y coloca pistas, trampas, criaturas y tesoros en consecuencia. Utiliza las puertas como puntos de decisión estratégica para tus jugadores.' },
|
|
166
|
+
{ type: 'tip', title: 'Guarda la Configuración antes de Añadir Notas', html: 'Copia el enlace del mapa o guarda el archivo JSON antes de anotar los encuentros. De este modo tendrás una copia limpia para entregar a los jugadores sin desvelar tus notas de director de juego.' },
|
|
167
|
+
],
|
|
168
|
+
faq,
|
|
169
|
+
bibliography,
|
|
170
|
+
howTo,
|
|
171
|
+
schemas: [faqSchema, appSchema, howToSchema] as unknown as Record<string, unknown>[],
|
|
172
|
+
};
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
3
|
+
import type { DungeonMapGeneratorLocaleContent, DungeonMapGeneratorUI } from '../entry';
|
|
4
|
+
|
|
5
|
+
const ui: DungeonMapGeneratorUI = {
|
|
6
|
+
intro: 'Choisissez une graine, réglez la grille et sélectionnez un style architectural. Générez une carte connectée pour vos notes, impression ou table virtuelle.',
|
|
7
|
+
seedLabel: 'Graine de la carte',
|
|
8
|
+
seedHint: 'Réutilisez une graine avec les mêmes réglages pour reconstruire exactement le même plan.',
|
|
9
|
+
randomSeed: 'Nouvelle graine',
|
|
10
|
+
sizeLabel: 'Taille d exploration',
|
|
11
|
+
sizeCompact: 'Session unique (One-shot)',
|
|
12
|
+
sizeSession: 'Session classique',
|
|
13
|
+
sizeStronghold: 'Forteresse',
|
|
14
|
+
fineTuneGrid: 'Réglage fin de la grille et densité',
|
|
15
|
+
columnsLabel: 'Colonnes',
|
|
16
|
+
rowsLabel: 'Lignes',
|
|
17
|
+
densityLabel: 'Densité de salles',
|
|
18
|
+
densityHint: 'Une densité élevée ajoute plus de pièces et de surface utilisable.',
|
|
19
|
+
styleLabel: 'Architecture de la carte',
|
|
20
|
+
dungeonStyle: 'Donjon',
|
|
21
|
+
dungeonStyleHint: 'Pièces en pierre avec couloirs de largeur simple.',
|
|
22
|
+
cavernStyle: 'Caverne',
|
|
23
|
+
cavernStyleHint: 'Chambres naturelles aux contours arrondis.',
|
|
24
|
+
scifiStyle: 'Science-Fiction',
|
|
25
|
+
scifiStyleHint: 'Modules larges avec couloirs de double largeur.',
|
|
26
|
+
generate: 'Générer la carte',
|
|
27
|
+
mapRegionLabel: 'Carte du donjon générée et commandes d exportation',
|
|
28
|
+
connectedBadge: 'Toutes les salles sont connectées',
|
|
29
|
+
roomsLabel: 'Salles',
|
|
30
|
+
doorsLabel: 'Portes',
|
|
31
|
+
floorLabel: 'Couverture du sol',
|
|
32
|
+
legendFloor: 'Sol praticable',
|
|
33
|
+
legendWall: 'Mur solide',
|
|
34
|
+
legendDoor: 'Porte ou sas',
|
|
35
|
+
editHint: 'Clic droit sur une case pour éditer',
|
|
36
|
+
editCell: 'Éditer cette case',
|
|
37
|
+
paintFloor: 'Sol',
|
|
38
|
+
paintWall: 'Mur',
|
|
39
|
+
paintDoor: 'Porte',
|
|
40
|
+
mapData: 'Données de carte',
|
|
41
|
+
copyLink: 'Copier le lien',
|
|
42
|
+
linkCopied: 'Lien copié',
|
|
43
|
+
exportPng: 'Télécharger PNG',
|
|
44
|
+
exportSvg: 'Télécharger SVG',
|
|
45
|
+
exportJson: 'Enregistrer le JSON',
|
|
46
|
+
importJson: 'Ouvrir un JSON',
|
|
47
|
+
importError: 'Ce fichier ne contient pas une configuration valide de donjon.',
|
|
48
|
+
compactMap: 'Exploration tendue',
|
|
49
|
+
balancedMap: 'Expédition équilibrée',
|
|
50
|
+
sprawlingMap: 'Forteresse vaste',
|
|
51
|
+
compactHint: 'Des transitions plus longues laissent plus de zones inconnues.',
|
|
52
|
+
balancedHint: 'Salles et couloirs équilibrent parfaitement l espace.',
|
|
53
|
+
sprawlingHint: 'Une grande couverture de sol favorise les rencontres dynamiques.',
|
|
54
|
+
mapReady: 'Légende de la carte',
|
|
55
|
+
dimensionsUnit: 'cases de grille',
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const faq = [
|
|
59
|
+
{
|
|
60
|
+
question: 'La même graine génère-t-elle toujours la même carte ?',
|
|
61
|
+
answer: 'Oui. La graine, les dimensions de grille, la densité et le style forment une configuration déterministe. Réutiliser les quatre paramètres reproduit exactement les mêmes pièces et portes.',
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
question: 'Toutes les salles sont-elles interconnectées ?',
|
|
65
|
+
answer: 'Oui. Les pièces sont reliées par un itinéraire principal après leur placement, garantissant que chaque zone praticable appartient à une seule carte connectée.',
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
question: 'Quelles sont les différences entre donjon, caverne et Sci-Fi ?',
|
|
69
|
+
answer: 'Le style donjon utilise des pièces en pierre régulières. Les cavernes façonnent des salles naturelles irrégulières. Le style Sci-Fi privilégie de larges modules avec sas doubles.',
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
question: 'Quel format exporter pour une table virtuelle (VTT) ?',
|
|
73
|
+
answer: 'Le format PNG est idéal pour la majorité des tables virtuelles. Le SVG reste net à n importe quelle échelle et s édite facilement dans des logiciels vectoriels.',
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
question: 'Peut-on partager une carte générée avec d autres personnes ?',
|
|
77
|
+
answer: 'Oui. Copiez le lien pour intégrer la configuration dans l URL ou téléchargez le fichier JSON. Le destinataire chargera le même donjon instantanément.',
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
question: 'Ce généateur inclut-il des monstres, pièges ou trésors ?',
|
|
81
|
+
answer: 'Non. Il produit un plan architectural neutre. La disposition des rencontres, pièges et trésors reste sous la responsabilité du maître du jeu.',
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
|
|
85
|
+
const howTo = [
|
|
86
|
+
{
|
|
87
|
+
name: 'Définir les dimensions',
|
|
88
|
+
text: 'Choisissez le nombre de colonnes et de lignes pour adapter la carte à vos notes ou à votre table virtuelle.',
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
name: 'Choisir l architecture',
|
|
92
|
+
text: 'Sélectionnez donjon, caverne ou science-fiction, puis ajustez la densité de salles.',
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
name: 'Générer et inspecter',
|
|
96
|
+
text: 'Saisissez une graine ou générez-en une nouvelle, puis vérifiez le nombre de pièces, portes et la surface.',
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'Exporter et partager',
|
|
100
|
+
text: 'Téléchargez en PNG ou SVG pour jouer, ou sauvegardez la configuration via un lien ou un fichier JSON.',
|
|
101
|
+
},
|
|
102
|
+
];
|
|
103
|
+
|
|
104
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
105
|
+
'@context': 'https://schema.org',
|
|
106
|
+
'@type': 'FAQPage',
|
|
107
|
+
mainEntity: faq.map((item) => ({
|
|
108
|
+
'@type': 'Question',
|
|
109
|
+
name: item.question,
|
|
110
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
111
|
+
})),
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
115
|
+
'@context': 'https://schema.org',
|
|
116
|
+
'@type': 'SoftwareApplication',
|
|
117
|
+
name: 'Générateur de Donjons Aléatoires',
|
|
118
|
+
operatingSystem: 'All',
|
|
119
|
+
applicationCategory: 'UtilitiesApplication',
|
|
120
|
+
description: 'Un générateur déterministe de cartes de donjon avec pièces connectées, couloirs, portes et exports PNG/SVG.',
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
const howToSchema: WithContext<HowTo> = {
|
|
124
|
+
'@context': 'https://schema.org',
|
|
125
|
+
'@type': 'HowTo',
|
|
126
|
+
name: 'Comment générer une carte de donjon connectée',
|
|
127
|
+
step: howTo.map((item) => ({
|
|
128
|
+
'@type': 'HowToStep',
|
|
129
|
+
name: item.name,
|
|
130
|
+
text: item.text,
|
|
131
|
+
})),
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
export const content: DungeonMapGeneratorLocaleContent = {
|
|
135
|
+
slug: 'generateur-carte-donjon-aleatoire',
|
|
136
|
+
title: 'Générateur de Cartes de Donjon Aléatoires pour Jeux de Rôle',
|
|
137
|
+
description: 'Créez des cartes reproductibles de donjons, cavernes et science-fiction avec pièces connectées, portes et export PNG/SVG.',
|
|
138
|
+
ui,
|
|
139
|
+
seo: [
|
|
140
|
+
{ type: 'title', text: 'Générez une Carte de Donjon Jouable grâce à une Graine Réutilisable', level: 2 },
|
|
141
|
+
{ type: 'paragraph', html: 'Une carte de donjon aléatoire efficace doit offrir bien plus qu un bruit visuel sans logique. Chaque pièce doit être accessible par des couloirs connectés, la grille doit correspondre à votre surface de jeu et le résultat doit pouvoir être rechargé à tout moment. Ce générateur traite la graine et les réglages comme une spécification de carte déterministe.' },
|
|
142
|
+
{ type: 'title', text: 'Dimensions de Grille pour Impression et Tables Virtuelles', level: 2 },
|
|
143
|
+
{ type: 'paragraph', html: 'Définir la taille de grille est la première étape pratique. Une petite grille s imprime facilement sur papier pour des aventures courtes, tandis qu une grande carte laisse de la place pour l exploration complexe et plusieurs factions. L image exportée préserve des cases parfaitement carrées pour s aligner facilement sur les grilles VTT.' },
|
|
144
|
+
{
|
|
145
|
+
type: 'table',
|
|
146
|
+
headers: ['Taille de grille', 'Usage typique', 'Densité initiale', 'Note de planification'],
|
|
147
|
+
rows: [
|
|
148
|
+
['20 par 16 cases', 'Aventure rapide (One-shot)', '35 à 45', 'Facile à imprimer et lecture visuelle rapide'],
|
|
149
|
+
['36 par 26 cases', 'Donjon de session', '45 à 55', 'Rythme équilibré entre pièces et couloirs'],
|
|
150
|
+
['52 par 38 cases', 'Complexe multi-sessions', '50 à 65', 'Espace vaste pour factions et chemins optionnels'],
|
|
151
|
+
],
|
|
152
|
+
},
|
|
153
|
+
{ type: 'tip', title: 'Adaptez la Carte à l Échelle des Rencontres', html: 'Calculez l espace nécessaire pour vos affrontements majeurs avant de choisir la taille totale du plateau. Un grand donjon rempli de pièces minuscules peut paraître à l étroit, tandis qu une carte compacte dotée d une grande salle centrale favorisera des scènes mémorables.' },
|
|
154
|
+
{ type: 'title', text: 'Interprétez la Couverture du Sol comme un Signal de Rythme', level: 2 },
|
|
155
|
+
{ type: 'paragraph', html: 'La couverture du sol indique le pourcentage du canevas représentant une zone praticable. Une faible couverture met l accent sur les zones inconnues et la tension du voyage. Une couverture moyenne offre une exploration fluide. Une couverture élevée crée un complexe fortifié où les combats peuvent s étendre entre pièces contiguës.' },
|
|
156
|
+
{
|
|
157
|
+
type: 'list',
|
|
158
|
+
items: [
|
|
159
|
+
'<strong>Exploration tendue :</strong> profitez des espaces vides pour suggérer l isolement ou des passages secrets.',
|
|
160
|
+
'<strong>Expédition équilibrée :</strong> alternez pièces d enquête, couloirs de liaison et salles de combat.',
|
|
161
|
+
'<strong>Forteresse vaste :</strong> préparez des lignes de vue claires, des patrouilles et des rencontres interconnectées.',
|
|
162
|
+
],
|
|
163
|
+
},
|
|
164
|
+
{ type: 'title', text: 'Transformez un Plan Neutre en Lieu d Aventure', level: 2 },
|
|
165
|
+
{ type: 'paragraph', html: 'La carte générée fournit uniquement la structure architecturale de base. Attribuez un rôle narratif à chaque pièce principale et placez vos indices, pièges et trésors en conséquence.' },
|
|
166
|
+
{ type: 'tip', title: 'Sauvegardez la Configuration avant d Annoter', html: 'Copiez le lien ou enregistrez le fichier JSON avant d ajouter vos notes de rencontre afin de conserver une version propre pour vos joueurs.' },
|
|
167
|
+
],
|
|
168
|
+
faq,
|
|
169
|
+
bibliography,
|
|
170
|
+
howTo,
|
|
171
|
+
schemas: [faqSchema, appSchema, howToSchema] as unknown as Record<string, unknown>[],
|
|
172
|
+
};
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
3
|
+
import type { DungeonMapGeneratorLocaleContent, DungeonMapGeneratorUI } from '../entry';
|
|
4
|
+
|
|
5
|
+
const ui: DungeonMapGeneratorUI = {
|
|
6
|
+
intro: 'Pilih seed, atur kisi, dan pilih gaya arsitektur. Buat peta yang terhubung untuk catatan, cetakan, atau meja virtual Anda.',
|
|
7
|
+
seedLabel: 'Seed peta',
|
|
8
|
+
seedHint: 'Gunakan seed yang sama dengan pengaturan serupa untuk membuat ulang peta yang persis sama.',
|
|
9
|
+
randomSeed: 'Seed baru',
|
|
10
|
+
sizeLabel: 'Ukuran ekspedisi',
|
|
11
|
+
sizeCompact: 'Satu sesi (One-shot)',
|
|
12
|
+
sizeSession: 'Sesi standar',
|
|
13
|
+
sizeStronghold: 'Benteng besar',
|
|
14
|
+
fineTuneGrid: 'Pengaturan kisi dan kepadatan',
|
|
15
|
+
columnsLabel: 'Kolom',
|
|
16
|
+
rowsLabel: 'Baris',
|
|
17
|
+
densityLabel: 'Kepadatan ruangan',
|
|
18
|
+
densityHint: 'Kepadatan lebih tinggi menambah lebih banyak ruang dan area lantai.',
|
|
19
|
+
styleLabel: 'Arsitektur peta',
|
|
20
|
+
dungeonStyle: 'Dungeon batu',
|
|
21
|
+
dungeonStyleHint: 'Ruangan batu dengan koridor lebar tunggal.',
|
|
22
|
+
cavernStyle: 'Gua alam',
|
|
23
|
+
cavernStyleHint: 'Ruang tidak teratur dengan tepi melengkung.',
|
|
24
|
+
scifiStyle: 'Sci-Fi',
|
|
25
|
+
scifiStyleHint: 'Modul luas dengan koridor penghubung ganda.',
|
|
26
|
+
generate: 'Buat peta ini',
|
|
27
|
+
mapRegionLabel: 'Peta dungeon yang dihasilkan dan kontrol ekspor',
|
|
28
|
+
connectedBadge: 'Semua ruangan terhubung',
|
|
29
|
+
roomsLabel: 'Ruangan',
|
|
30
|
+
doorsLabel: 'Pintu',
|
|
31
|
+
floorLabel: 'Cakupan lantai',
|
|
32
|
+
legendFloor: 'Lantai dapat dilalui',
|
|
33
|
+
legendWall: 'Dinding padat',
|
|
34
|
+
legendDoor: 'Pintu atau pintu kedap',
|
|
35
|
+
editHint: 'Klik kanan sel untuk mengedit',
|
|
36
|
+
editCell: 'Edit sel ini',
|
|
37
|
+
paintFloor: 'Lantai',
|
|
38
|
+
paintWall: 'Dinding',
|
|
39
|
+
paintDoor: 'Pintu',
|
|
40
|
+
mapData: 'Data peta',
|
|
41
|
+
copyLink: 'Salin tautan peta',
|
|
42
|
+
linkCopied: 'Tautan disalin',
|
|
43
|
+
exportPng: 'Unduh PNG',
|
|
44
|
+
exportSvg: 'Unduh SVG',
|
|
45
|
+
exportJson: 'Simpan JSON',
|
|
46
|
+
importJson: 'Buka JSON',
|
|
47
|
+
importError: 'Berkas ini tidak berisi konfigurasi peta dungeon yang valid.',
|
|
48
|
+
compactMap: 'Eksplorasi tegang',
|
|
49
|
+
balancedMap: 'Ekspedisi seimbang',
|
|
50
|
+
sprawlingMap: 'Benteng terbuka',
|
|
51
|
+
compactHint: 'Jalur transisi lebih panjang menyisakan lebih banyak area tak diketahui.',
|
|
52
|
+
balancedHint: 'Ruangan dan koridor berbagi tata letak dengan seimbang.',
|
|
53
|
+
sprawlingHint: 'Cakupan lantai luas mendukung pertempuran dan pergerakan cepat.',
|
|
54
|
+
mapReady: 'Legenda peta',
|
|
55
|
+
dimensionsUnit: 'sel kisi',
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const faq = [
|
|
59
|
+
{
|
|
60
|
+
question: 'Apakah seed yang sama selalu menghasilkan peta dungeon yang sama?',
|
|
61
|
+
answer: 'Ya. Seed, dimensi kisi, kepadatan, dan gaya arsitektur membentuk konfigurasi deterministik. Menggunakan kembali keempat pengaturan akan merekonstruksi ruangan dan pintu yang persis sama.',
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
question: 'Apakah semua ruangan yang dihasilkan dapat dijangkau?',
|
|
65
|
+
answer: 'Ya. Ruangan dihubungkan melalui rute utama setelah penempatan, memastikan setiap area lantai yang dapat dilalui terhubung dalam satu peta.',
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
question: 'Apa perbedaan antara gaya dungeon, gua, dan Sci-Fi?',
|
|
69
|
+
answer: 'Gaya dungeon menggunakan ruangan batu teratur. Gua membentuk ruang alami yang tidak teratur. Gaya Sci-Fi mengutamakan modul luas dengan koridor penghubung ganda.',
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
question: 'Format apa yang sebaiknya diekspor untuk meja virtual (VTT)?',
|
|
73
|
+
answer: 'PNG adalah pilihan paling sederhana untuk sebagian besar VTT. SVG tetap tajam pada skala apa pun dan mudah diedit di perangkat lunak vektor.',
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
question: 'Bisakah orang lain membuat ulang peta dungeon acak saya?',
|
|
77
|
+
answer: 'Ya. Salin tautan peta atau kirim berkas JSON. Penerima dapat langsung memuat konfigurasi yang sama tanpa akun.',
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
question: 'Apakah generator ini menambahkan monster, jebakan, atau harta karun?',
|
|
81
|
+
answer: 'Tidak. Generator ini membuat denah arsitektur netral agar Anda dapat mengisinya sesuai aturan permainan masing-masing.',
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
|
|
85
|
+
const howTo = [
|
|
86
|
+
{
|
|
87
|
+
name: 'Atur dimensi kisi',
|
|
88
|
+
text: 'Pilih jumlah kolom dan baris yang sesuai dengan ruang catatan atau meja virtual Anda.',
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
name: 'Pilih arsitektur',
|
|
92
|
+
text: 'Pilih dungeon, gua, atau Sci-Fi, lalu sesuaikan kepadatan ruangan.',
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
name: 'Buat dan periksa',
|
|
96
|
+
text: 'Masukkan seed, buat peta, dan periksa ringkasan ruangan, pintu, dan cakupan lantai.',
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'Ekspor atau bagikan',
|
|
100
|
+
text: 'Unduh PNG atau SVG untuk dimainkan, atau simpan konfigurasi melalui tautan atau berkas JSON.',
|
|
101
|
+
},
|
|
102
|
+
];
|
|
103
|
+
|
|
104
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
105
|
+
'@context': 'https://schema.org',
|
|
106
|
+
'@type': 'FAQPage',
|
|
107
|
+
mainEntity: faq.map((item) => ({
|
|
108
|
+
'@type': 'Question',
|
|
109
|
+
name: item.question,
|
|
110
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
111
|
+
})),
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
115
|
+
'@context': 'https://schema.org',
|
|
116
|
+
'@type': 'SoftwareApplication',
|
|
117
|
+
name: 'Pembuat Peta Dungeon Acak',
|
|
118
|
+
operatingSystem: 'All',
|
|
119
|
+
applicationCategory: 'UtilitiesApplication',
|
|
120
|
+
description: 'Pembuat peta dungeon acak deterministik dengan ruangan terhubung, pintu, dan ekspor lokal.',
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
const howToSchema: WithContext<HowTo> = {
|
|
124
|
+
'@context': 'https://schema.org',
|
|
125
|
+
'@type': 'HowTo',
|
|
126
|
+
name: 'Cara membuat peta dungeon terhubung',
|
|
127
|
+
step: howTo.map((item) => ({
|
|
128
|
+
'@type': 'HowToStep',
|
|
129
|
+
name: item.name,
|
|
130
|
+
text: item.text,
|
|
131
|
+
})),
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
export const content: DungeonMapGeneratorLocaleContent = {
|
|
135
|
+
slug: 'pembuat-peta-dungeon-acak',
|
|
136
|
+
title: 'Pembuat Peta Dungeon Acak untuk Game RPG Tabletop',
|
|
137
|
+
description: 'Buat peta dungeon, gua, dan Sci-Fi yang dapat direproduksi dengan ruangan terhubung, pintu, dan ekspor PNG/SVG.',
|
|
138
|
+
ui,
|
|
139
|
+
seo: [
|
|
140
|
+
{ type: 'title', text: 'Buat Peta Dungeon Siap Pakai dengan Seed yang Dapat Digunakan Kembali', level: 2 },
|
|
141
|
+
{ type: 'paragraph', html: 'Peta dungeon acak yang berguna membutuhkan lebih dari sekadar elemen visual acak. Setiap ruangan harus dapat dijangkau, kisi harus sesuai dengan permukaan permainan, dan hasilnya harus dapat dipulihkan kapan saja. Pembuat peta ini memperlakukan seed dan kontrol sebagai spesifikasi peta deterministik ringkas.' },
|
|
142
|
+
{ type: 'title', text: 'Pilih Dimensi Kisi untuk Cetakan dan Meja Virtual', level: 2 },
|
|
143
|
+
{ type: 'paragraph', html: 'Menentukan ukuran kisi adalah langkah praktis pertama. Kisi kecil mudah dicetak di kertas untuk petualangan singkat, sedangkan peta besar memberikan ruang untuk eksplorasi kompleks dan banyak faksi. Gambar yang diekspor mempertahankan sel persegi sempurna untuk disesuaikan dengan kisi VTT.' },
|
|
144
|
+
{
|
|
145
|
+
type: 'table',
|
|
146
|
+
headers: ['Ukuran kisi', 'Penggunaan umum', 'Kepadatan awal', 'Catatan perencanaan'],
|
|
147
|
+
rows: [
|
|
148
|
+
['20 x 16 sel', 'Petualangan singkat (One-shot)', '35 hingga 45', 'Mudah dicetak dan dibaca dengan cepat'],
|
|
149
|
+
['36 x 26 sel', 'Dungeon sesi standar', '45 hingga 55', 'Ritme seimbang antara ruangan dan koridor'],
|
|
150
|
+
['52 x 38 sel', 'Kompleks multi-sesi', '50 hingga 65', 'Ruang luas untuk banyak faksi dan rute opsional'],
|
|
151
|
+
],
|
|
152
|
+
},
|
|
153
|
+
{ type: 'tip', title: 'Sesuaikan Peta dengan Skala Pertempuran', html: 'Hitung sel yang dibutuhkan untuk pertempuran utama sebelum memilih ukuran total. Dungeon besar dengan ruangan kecil akan terasa sempit, sedangkan denah ringkas dengan satu ruangan utama yang luas akan menciptakan momen berkesan.' },
|
|
154
|
+
{ type: 'title', text: 'Pahami Cakupan Lantai sebagai Ritme Permainan', level: 2 },
|
|
155
|
+
{ type: 'paragraph', html: 'Cakupan lantai menunjukkan persentase area yang dapat dilalui. Cakupan rendah menekankan area tak diketahui dan ketegangan eksplorasi. Cakupan sedang memberikan eksplorasi yang lancar. Cakupan tinggi menciptakan kompleks benteng di mana pertempuran dapat meluas ke ruangan sekitar.' },
|
|
156
|
+
{
|
|
157
|
+
type: 'list',
|
|
158
|
+
items: [
|
|
159
|
+
'<strong>Eksplorasi tegang:</strong> manfaatkan ruang kosong untuk memberi kesan terisolasi atau jalan rahasia.',
|
|
160
|
+
'<strong>Ekspedisi seimbang:</strong> selang-selingkan ruangan investigasi dengan koridor penghubung.',
|
|
161
|
+
'<strong>Benteng terbuka:</strong> siapkan rute patroli dan pertempuran yang saling terhubung.',
|
|
162
|
+
],
|
|
163
|
+
},
|
|
164
|
+
{ type: 'title', text: 'Ubah Denah Netral Menjadi Lokasi Petualangan', level: 2 },
|
|
165
|
+
{ type: 'paragraph', html: 'Peta yang dihasilkan hanya menyediakan arsitektur dasar. Berikan peran naratif pada setiap ruangan utama dan tempatkan petunjuk, jebakan, serta harta karun sesuai kebutuhan.' },
|
|
166
|
+
{ type: 'tip', title: 'Simpan Konfigurasi Sebelum Menambahkan Catatan', html: 'Salin tautan peta atau simpan berkas JSON sebelum mencatat pertempuran agar Anda memiliki salinan bersih untuk pemain tanpa membocorkan rahasia Game Master.' },
|
|
167
|
+
],
|
|
168
|
+
faq,
|
|
169
|
+
bibliography,
|
|
170
|
+
howTo,
|
|
171
|
+
schemas: [faqSchema, appSchema, howToSchema] as unknown as Record<string, unknown>[],
|
|
172
|
+
};
|