@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.
Files changed (80) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -0
  3. package/src/entries.ts +4 -0
  4. package/src/index.ts +1 -0
  5. package/src/tests/locale_completeness.test.ts +1 -1
  6. package/src/tests/seo_translation_completeness.test.ts +69 -0
  7. package/src/tests/spanish_leakage.test.ts +25 -3
  8. package/src/tests/tool_validation.test.ts +1 -1
  9. package/src/tool/decision-wheel/i18n/de.ts +10 -10
  10. package/src/tool/decision-wheel/i18n/es.ts +10 -10
  11. package/src/tool/decision-wheel/i18n/fr.ts +10 -10
  12. package/src/tool/decision-wheel/i18n/id.ts +10 -10
  13. package/src/tool/decision-wheel/i18n/it.ts +10 -10
  14. package/src/tool/decision-wheel/i18n/ja.ts +10 -10
  15. package/src/tool/decision-wheel/i18n/ko.ts +10 -10
  16. package/src/tool/decision-wheel/i18n/nl.ts +10 -10
  17. package/src/tool/decision-wheel/i18n/pl.ts +10 -10
  18. package/src/tool/decision-wheel/i18n/pt.ts +10 -10
  19. package/src/tool/decision-wheel/i18n/sv.ts +10 -10
  20. package/src/tool/decision-wheel/i18n/tr.ts +10 -10
  21. package/src/tool/decision-wheel/i18n/zh.ts +10 -10
  22. package/src/tool/dungeon-map-generator/bibliography.astro +16 -0
  23. package/src/tool/dungeon-map-generator/bibliography.ts +12 -0
  24. package/src/tool/dungeon-map-generator/component.astro +134 -0
  25. package/src/tool/dungeon-map-generator/controller.ts +242 -0
  26. package/src/tool/dungeon-map-generator/document.ts +72 -0
  27. package/src/tool/dungeon-map-generator/dom-views.ts +139 -0
  28. package/src/tool/dungeon-map-generator/editor.ts +57 -0
  29. package/src/tool/dungeon-map-generator/entry.ts +28 -0
  30. package/src/tool/dungeon-map-generator/evaluator.ts +40 -0
  31. package/src/tool/dungeon-map-generator/i18n/de.ts +172 -0
  32. package/src/tool/dungeon-map-generator/i18n/en.ts +172 -0
  33. package/src/tool/dungeon-map-generator/i18n/es.ts +172 -0
  34. package/src/tool/dungeon-map-generator/i18n/fr.ts +172 -0
  35. package/src/tool/dungeon-map-generator/i18n/id.ts +172 -0
  36. package/src/tool/dungeon-map-generator/i18n/it.ts +172 -0
  37. package/src/tool/dungeon-map-generator/i18n/ja.ts +172 -0
  38. package/src/tool/dungeon-map-generator/i18n/ko.ts +172 -0
  39. package/src/tool/dungeon-map-generator/i18n/nl.ts +172 -0
  40. package/src/tool/dungeon-map-generator/i18n/pl.ts +172 -0
  41. package/src/tool/dungeon-map-generator/i18n/pt.ts +172 -0
  42. package/src/tool/dungeon-map-generator/i18n/ru.ts +172 -0
  43. package/src/tool/dungeon-map-generator/i18n/sv.ts +172 -0
  44. package/src/tool/dungeon-map-generator/i18n/tr.ts +172 -0
  45. package/src/tool/dungeon-map-generator/i18n/zh.ts +172 -0
  46. package/src/tool/dungeon-map-generator/index.ts +11 -0
  47. package/src/tool/dungeon-map-generator/logic.test.ts +75 -0
  48. package/src/tool/dungeon-map-generator/logic.ts +255 -0
  49. package/src/tool/dungeon-map-generator/random-dungeon-map-generator.css +678 -0
  50. package/src/tool/dungeon-map-generator/seo.astro +16 -0
  51. package/src/tool/dungeon-map-generator/storage.ts +18 -0
  52. package/src/tool/dungeon-map-generator/ui.ts +53 -0
  53. package/src/tool/dungeon-map-generator/validation.ts +40 -0
  54. package/src/tool/hidden-role-dealer/i18n/de.ts +6 -6
  55. package/src/tool/hidden-role-dealer/i18n/id.ts +6 -6
  56. package/src/tool/hidden-role-dealer/i18n/it.ts +6 -6
  57. package/src/tool/hidden-role-dealer/i18n/ja.ts +6 -6
  58. package/src/tool/hidden-role-dealer/i18n/ko.ts +6 -6
  59. package/src/tool/hidden-role-dealer/i18n/nl.ts +6 -6
  60. package/src/tool/hidden-role-dealer/i18n/pl.ts +7 -7
  61. package/src/tool/hidden-role-dealer/i18n/pt.ts +7 -7
  62. package/src/tool/hidden-role-dealer/i18n/ru.ts +7 -7
  63. package/src/tool/hidden-role-dealer/i18n/sv.ts +7 -7
  64. package/src/tool/hidden-role-dealer/i18n/tr.ts +7 -7
  65. package/src/tool/hidden-role-dealer/i18n/zh.ts +9 -9
  66. package/src/tool/scatter-direction-selector/i18n/de.ts +9 -9
  67. package/src/tool/scatter-direction-selector/i18n/es.ts +9 -9
  68. package/src/tool/scatter-direction-selector/i18n/fr.ts +12 -12
  69. package/src/tool/scatter-direction-selector/i18n/id.ts +9 -9
  70. package/src/tool/scatter-direction-selector/i18n/it.ts +11 -11
  71. package/src/tool/scatter-direction-selector/i18n/ja.ts +8 -8
  72. package/src/tool/scatter-direction-selector/i18n/ko.ts +8 -8
  73. package/src/tool/scatter-direction-selector/i18n/nl.ts +9 -10
  74. package/src/tool/scatter-direction-selector/i18n/pl.ts +9 -9
  75. package/src/tool/scatter-direction-selector/i18n/pt.ts +12 -12
  76. package/src/tool/scatter-direction-selector/i18n/ru.ts +7 -7
  77. package/src/tool/scatter-direction-selector/i18n/sv.ts +9 -9
  78. package/src/tool/scatter-direction-selector/i18n/tr.ts +8 -8
  79. package/src/tool/scatter-direction-selector/i18n/zh.ts +11 -11
  80. 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: 'Scegli un seme, imposta la griglia e seleziona uno stile architettonico. Genera una mappa connessa per appunti, stampa o tavolo virtuale.',
7
+ seedLabel: 'Seme della mappa',
8
+ seedHint: 'Riusa lo stesso seme con le stesse impostazioni per rigenerare esattamente la stessa mappa.',
9
+ randomSeed: 'Nuovo seme',
10
+ sizeLabel: 'Dimensione spedizione',
11
+ sizeCompact: 'Sessione singola (One-shot)',
12
+ sizeSession: 'Sessione standard',
13
+ sizeStronghold: 'Fortezza',
14
+ fineTuneGrid: 'Regolazione fine griglia e densità',
15
+ columnsLabel: 'Colonne',
16
+ rowsLabel: 'Righe',
17
+ densityLabel: 'Densità stanze',
18
+ densityHint: 'Una densità maggiore aggiunge più stanze e superficie calpestabile.',
19
+ styleLabel: 'Architettura mappa',
20
+ dungeonStyle: 'Dungeon',
21
+ dungeonStyleHint: 'Stanze in pietra con corridoi a larghezza singola.',
22
+ cavernStyle: 'Caverna',
23
+ cavernStyleHint: 'Stanze naturali irregolari con bordi smussati.',
24
+ scifiStyle: 'Sci-Fi',
25
+ scifiStyleHint: 'Moduli ampi con corridoi a doppia larghezza.',
26
+ generate: 'Disegna mappa',
27
+ mapRegionLabel: 'Mappa dungeon generata e controlli di esportazione',
28
+ connectedBadge: 'Tutte le stanze connesse',
29
+ roomsLabel: 'Stanze',
30
+ doorsLabel: 'Porte',
31
+ floorLabel: 'Copertura pavimento',
32
+ legendFloor: 'Pavimento calpestabile',
33
+ legendWall: 'Muro solido',
34
+ legendDoor: 'Porta o boccaporto',
35
+ editHint: 'Tasto destro su una cella per modificare',
36
+ editCell: 'Modifica questa cella',
37
+ paintFloor: 'Pavimento',
38
+ paintWall: 'Muro',
39
+ paintDoor: 'Porta',
40
+ mapData: 'Dati mappa',
41
+ copyLink: 'Copia link mappa',
42
+ linkCopied: 'Link copiato',
43
+ exportPng: 'Scarica PNG',
44
+ exportSvg: 'Scarica SVG',
45
+ exportJson: 'Salva JSON',
46
+ importJson: 'Apri JSON',
47
+ importError: 'Questo file non contiene una configurazione di dungeon valida.',
48
+ compactMap: 'Esplorazione tesa',
49
+ balancedMap: 'Spedizione equilibrata',
50
+ sprawlingMap: 'Fortezza aperta',
51
+ compactHint: 'Corridoi più lunghi lasciano più spazio sconosciuto tra le stanze.',
52
+ balancedHint: 'Stanze e corridoi dividono lo spazio in modo bilanciato.',
53
+ sprawlingHint: 'Un ampia copertura del pavimento favorisce scontri e movimenti rapidi.',
54
+ mapReady: 'Legenda mappa',
55
+ dimensionsUnit: 'celle di griglia',
56
+ };
57
+
58
+ const faq = [
59
+ {
60
+ question: 'Lo stesso seme genera sempre la stessa mappa?',
61
+ answer: 'Sì. Il seme, le dimensioni della griglia, la densità e lo stile formano una configurazione deterministica. Riusare i quattro parametri rigenera esattamente le stesse stanze e porte.',
62
+ },
63
+ {
64
+ question: 'Tutte le stanze generate sono raggiungibili?',
65
+ answer: 'Sì. Le stanze vengono collegate tramite un percorso principale dopo il posizionamento, garantendo che ogni area calpestabile appartenga a un unica mappa connessa.',
66
+ },
67
+ {
68
+ question: 'Quali sono le differenze tra gli stili dungeon, caverna e Sci-Fi?',
69
+ answer: 'Lo stile dungeon usa stanze quadrate in pietra. Le caverne creano stanze naturali irregolari. Lo stile Sci-Fi predilige moduli ampi con corridoi doppi.',
70
+ },
71
+ {
72
+ question: 'Quale formato esportare per un tavolo virtuale (VTT)?',
73
+ answer: 'PNG è l opzione migliore per la maggior parte dei VTT. SVG rimane nitido a qualsiasi scala ed è facile da modificare in programmi vettoriali.',
74
+ },
75
+ {
76
+ question: 'Un altra persona può rigenerare la mia mappa aleatoria?',
77
+ answer: 'Sì. Copia il link per includere la configurazione nell URL o invia il file JSON. Il destinatario caricherà lo stesso dungeon all istante.',
78
+ },
79
+ {
80
+ question: 'Questo generatore aggiunge mostri, trappole o tesori?',
81
+ answer: 'No. Crea una pianta architettonica neutrale affinché tu possa adattarla a qualsiasi sistema di gioco. La progettazione degli scontri spetta al Game Master.',
82
+ },
83
+ ];
84
+
85
+ const howTo = [
86
+ {
87
+ name: 'Imposta le dimensioni',
88
+ text: 'Scegli il numero di colonne e righe in base allo spazio per i tuoi appunti o per la scena VTT.',
89
+ },
90
+ {
91
+ name: 'Scegli l architettura',
92
+ text: 'Seleziona dungeon, caverna o Sci-Fi, quindi regola la densità delle stanze.',
93
+ },
94
+ {
95
+ name: 'Genera e ispeziona',
96
+ text: 'Inserisci un seme o generane uno nuovo, disegna la mappa e controlla il riepilogo.',
97
+ },
98
+ {
99
+ name: 'Esporta o condividi',
100
+ text: 'Scarica in PNG o SVG per giocare, oppure salva la configurazione tramite link o file 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: 'Generatore di Mappe Dungeon Casuali',
118
+ operatingSystem: 'All',
119
+ applicationCategory: 'UtilitiesApplication',
120
+ description: 'Un generatore deterministico di mappe dungeon con stanze connesse, porte ed esportazioni locali.',
121
+ };
122
+
123
+ const howToSchema: WithContext<HowTo> = {
124
+ '@context': 'https://schema.org',
125
+ '@type': 'HowTo',
126
+ name: 'Come generare una mappa dungeon connessa',
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: 'generatore-mappe-dungeon-casuali',
136
+ title: 'Generatore di Mappe Dungeon Casuali per Giochi di Ruolo',
137
+ description: 'Crea mappe riproducibili di dungeon, caverne e Sci-Fi con stanze connesse, porte ed esportazione PNG/SVG.',
138
+ ui,
139
+ seo: [
140
+ { type: 'title', text: 'Genera una Mappa Dungeon Giocabile tramite un Seme Riusabile', level: 2 },
141
+ { type: 'paragraph', html: 'Una mappa dungeon casuale ed efficace richiede molto più di un semplice rumore visivo senza logica. Ogni stanza deve essere raggiungibile tramite corridoi connessi, la griglia deve adattarsi alla superficie di gioco e il risultato deve poter essere recuperato in qualsiasi momento. Questo generatore tratta il seme e i controlli come una specifica di mappa deterministica.' },
142
+ { type: 'title', text: 'Dimensioni della Griglia per Stampa e Tavoli Virtuali', level: 2 },
143
+ { type: 'paragraph', html: 'Impostare la dimensione della griglia è il primo passo pratico. Una griglia piccola si stampa facilmente su carta per avventure brevi, mentre una mappa ampia lascia spazio per esplorazioni complesse e fazioni multiple. L immagine esportata mantiene celle perfettamente quadrate per allinearsi facilmente con la griglia dei VTT.' },
144
+ {
145
+ type: 'table',
146
+ headers: ['Dimensione griglia', 'Uso tipico', 'Densità iniziale', 'Nota di pianificazione'],
147
+ rows: [
148
+ ['20 per 16 celle', 'Avventura breve (One-shot)', 'Da 35 a 45', 'Facile da stampare e di rapida lettura'],
149
+ ['36 per 26 celle', 'Dungeon di sessione', 'Da 45 a 55', 'Ritmo equilibrato tra stanze e corridoi'],
150
+ ['52 per 38 celle', 'Complesso multi-sessione', 'Da 50 a 65', 'Ampio spazio per fazioni e percorsi opzionali'],
151
+ ],
152
+ },
153
+ { type: 'tip', title: 'Adatta la Mappa alla Scala degli Scontri', html: 'Calcola le celle necessarie per i tuoi combattimenti principali prima di scegliere la dimensione totale. Un grande dungeon con stanze minuscole risulterà stretto, mentre una pianta compatta con una stanza principale ampia favorirà scene memorabili.' },
154
+ { type: 'title', text: 'Interpreta la Copertura del Pavimento come Ritmo di Gioco', level: 2 },
155
+ { type: 'paragraph', html: 'La copertura del pavimento indica la percentuale di superficie calpestabile. Una copertura bassa accentua lo spazio sconosciuto e la tensione dell esplorazione. Una copertura media offre un esplorazione fluida. Una copertura elevata crea complessi fortificati in cui gli scontri possono estendersi alle stanze adiacenti.' },
156
+ {
157
+ type: 'list',
158
+ items: [
159
+ '<strong>Esplorazione tesa:</strong> sfrutta gli spazi vuoti per suggerire isolamento o passaggi segreti.',
160
+ '<strong>Spedizione equilibrata:</strong> alterna stanze di indagine, corridoi di collegamento e aree di combattimento.',
161
+ '<strong>Fortezza aperta:</strong> disegna linee di vista chiare, pattuglie ed eventi interconnessi.',
162
+ ],
163
+ },
164
+ { type: 'title', text: 'Trasforma una Pianta Neutra in un Luogo d Avventura', level: 2 },
165
+ { type: 'paragraph', html: 'La mappa generata fornisce solo l architettura di base. Assegna un ruolo narrativo a ogni stanza chiave e posiziona indizi, trappole e tesori di conseguenza.' },
166
+ { type: 'tip', title: 'Salva la Configurazione prima di Aggiungere Note', html: 'Copia il link della mappa o salva il file JSON prima di aggiungere le tue note sugli scontri per conservare una copia pulita da consegnare ai giocatori.' },
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: 'シード値を選択し、グリッドと建築スタイルを設定します。メモ、印刷、オンラインセッション(VTT)で使えるマップを生成します。',
7
+ seedLabel: 'マップシード値',
8
+ seedHint: '同じ設定で同じシード値を使用すると、まったく同じマップを再現できます。',
9
+ randomSeed: '新しいシード値',
10
+ sizeLabel: '探検規模',
11
+ sizeCompact: '単発セッション(ワンショット)',
12
+ sizeSession: '標準セッション',
13
+ sizeStronghold: '大規模要塞',
14
+ fineTuneGrid: 'グリッドと密度の微調整',
15
+ columnsLabel: '列数(横)',
16
+ rowsLabel: '行数(縦)',
17
+ densityLabel: '部屋の密度',
18
+ densityHint: '密度を高くすると、より多くの部屋と歩行可能な床面が生成されます。',
19
+ styleLabel: 'マップ建築スタイル',
20
+ dungeonStyle: 'ダンジョン',
21
+ dungeonStyleHint: '標準的な石造りの部屋と単一幅の通路。',
22
+ cavernStyle: '洞窟',
23
+ cavernStyleHint: '曲線を描く不規則な天然空洞。',
24
+ scifiStyle: 'SFモジュール',
25
+ scifiStyleHint: '広々とした部屋と2マス幅の接続ハッチ。',
26
+ generate: 'このマップを描画',
27
+ mapRegionLabel: '生成されたダンジョンマップとエクスポート操作',
28
+ connectedBadge: '全小部屋接続完了',
29
+ roomsLabel: '部屋数',
30
+ doorsLabel: 'ドア数',
31
+ floorLabel: '床面カバー率',
32
+ legendFloor: '移動可能な床',
33
+ legendWall: '堅固な壁',
34
+ legendDoor: 'ドア / ハッチ',
35
+ editHint: 'マスを右クリックして編集',
36
+ editCell: 'このマスを編集',
37
+ paintFloor: '床',
38
+ paintWall: '壁',
39
+ paintDoor: 'ドア',
40
+ mapData: 'マップデータ',
41
+ copyLink: 'マップリンクをコピー',
42
+ linkCopied: 'リンクをコピーしました',
43
+ exportPng: 'PNGダウンロード',
44
+ exportSvg: 'SVGダウンロード',
45
+ exportJson: 'JSON保存',
46
+ importJson: 'JSONを開く',
47
+ importError: 'このファイルには有効なダンジョン設定が含まれていません。',
48
+ compactMap: '緊迫した探索',
49
+ balancedMap: 'バランス型の探検',
50
+ sprawlingMap: '広大な要塞',
51
+ compactHint: '長い通路により部屋間に多くの未知の空間が残ります。',
52
+ balancedHint: '部屋と通路が心地よく配置されます。',
53
+ sprawlingHint: '広い床面積により戦闘や高速移動が容易になります。',
54
+ mapReady: 'マップ凡例',
55
+ dimensionsUnit: 'グリッドマス',
56
+ };
57
+
58
+ const faq = [
59
+ {
60
+ question: '同じシード値からは常に同じマップが生成されますか?',
61
+ answer: 'はい。シード値、グリッド寸法、密度、建築スタイルによって決定論的にマップが作成されます。',
62
+ },
63
+ {
64
+ question: '生成されたすべての部屋へ移動できますか?',
65
+ answer: 'はい。配置後に最小全域ルーツ接続が行われるため、すべての部屋へ到達可能です。',
66
+ },
67
+ {
68
+ question: 'ダンジョン、洞窟、SFスタイルの違いは何ですか?',
69
+ answer: 'ダンジョンは石造りの四角い部屋、洞窟は曲線状の空洞、SFスタイルは広々としたモジュールと2マス幅の通路を生成します。',
70
+ },
71
+ {
72
+ question: 'オンラインセッション(VTT)にはどの形式が最適ですか?',
73
+ answer: 'PNG形式が最も手軽です。SVG形式は拡大しても鮮明さを保ち、ベクトルソフトでの編集に適しています。',
74
+ },
75
+ {
76
+ question: '他のプレイヤーと生成したマップを共有できますか?',
77
+ answer: 'はい。マップリンクをコピーするかJSONファイルを共有することで、完全に同じマップを再現できます。',
78
+ },
79
+ {
80
+ question: 'モンスターや宝箱などのデータも自動配置されますか?',
81
+ answer: 'いいえ。ゲームマスターが自由なルールで装飾できるよう、純粋な建築フロアプランのみを提供します。',
82
+ },
83
+ ];
84
+
85
+ const howTo = [
86
+ {
87
+ name: 'グリッド寸法を設定',
88
+ text: 'ノートや印刷紙面、VTTのシーンサイズに合わせて列数と行数を指定します。',
89
+ },
90
+ {
91
+ name: '建築スタイルを選択',
92
+ text: 'ダンジョン、洞窟、SFから選択し、部屋の密度を調整します。',
93
+ },
94
+ {
95
+ name: 'マップを生成して確認',
96
+ text: 'シード値を入力して生成し、部屋数や床面積の統計を確認します。',
97
+ },
98
+ {
99
+ name: 'エクスポートして共有',
100
+ text: 'PNG/SVGでダウンロードするか、リンクや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: 'ランダムダンジョンマップ生成ツール',
118
+ operatingSystem: 'All',
119
+ applicationCategory: 'UtilitiesApplication',
120
+ description: '全小部屋が接続されたランダムダンジョンマップを決定論的に生成するツール。',
121
+ };
122
+
123
+ const howToSchema: WithContext<HowTo> = {
124
+ '@context': 'https://schema.org',
125
+ '@type': 'HowTo',
126
+ name: '接続されたダンジョンマップの生成方法',
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: 'random-dungeon-map-generator',
136
+ title: 'TRPG用ランダムダンジョンマップ生成ツール',
137
+ description: 'ダンジョン、洞窟、SF構造のマップを生成。全部屋接続保証、PNG/SVGエクスポート対応。',
138
+ ui,
139
+ seo: [
140
+ { type: 'title', text: 'シード値を利用してプレイ可能なダンジョンマップを再現生成', level: 2 },
141
+ { type: 'paragraph', html: '実用的なダンジョンマップには単なるランダムなノイズ以上の構造が必要です。すべての部屋が通路で接続され、グリッドサイズが卓の環境に適合し、必要な時にいつでも同じ構造を再現できることが求められます。このツールはシード値と設定項目を組み合わせ、再現可能なマップを生成します。' },
142
+ { type: 'title', text: '印刷用紙やVTT(オンライン卓)に合わせたグリッド調整', level: 2 },
143
+ { type: 'paragraph', html: '用途に応じたグリッドサイズの設定が最初の一歩です。小さめのグリッドは印刷しやすく短時間のセッションに最適です。大きめのグリッドは広大な探索領域を提供します。出力画像は正方形グリッドを保持しているため、VTTのマス目合わせもスムーズに行えます。' },
144
+ {
145
+ type: 'table',
146
+ headers: ['グリッドサイズ', '主な用途', '推奨密度', '設計メモ'],
147
+ rows: [
148
+ ['20 × 16 マス', '単発セッション / ワンショット', '35 〜 45', '印刷しやすく視認性が高い'],
149
+ ['36 × 26 マス', '標準的なセッション', '45 〜 55', '部屋と通路のバランスが良い'],
150
+ ['52 × 38 マス', '大規模複合ダンジョン', '50 〜 65', '複数の陣営や迂回路を配置可能'],
151
+ ],
152
+ },
153
+ { type: 'tip', title: '戦闘スケールに合わせた部屋サイズの確保', html: '全体サイズを決める前に、想定される最も大規模な戦闘シーンに必要なスペースを計算してください。巨大なマップでも部屋が狭すぎると移動が困難になります。' },
154
+ { type: 'title', text: '床面カバー率から探索のテンポを読み取る', level: 2 },
155
+ { type: 'paragraph', html: '床面カバー率はキャンバス全体の何パーセントが歩行可能な空間であるかを示します。カバー率が低いと部屋同士が離れ、静かな緊迫感が生まれます。カバー率が高いと活発な遭遇が発生しやすくなります。' },
156
+ {
157
+ type: 'list',
158
+ items: [
159
+ '<strong>緊迫した探索:</strong> 余白部分を活かして隠し通路や壁の奥の気配を演出します。',
160
+ '<strong>バランス型探検:</strong> 調査室、廊下、遭遇部屋をバランスよく配置します。',
161
+ '<strong>広大な要塞:</strong> 視線が通りやすく、敵の巡回ルートが複雑に交差する構造にします。',
162
+ ],
163
+ },
164
+ { type: 'title', text: '中立的なマップ構造から物語の舞台へ', level: 2 },
165
+ { type: 'paragraph', html: '生成されたマップは純粋な建築構造のみを提供します。主要な部屋に役割を与え、それに応じて罠や手がかり、モンスターを配置してください。' },
166
+ { type: 'tip', title: 'メモを書き込む前に設定を保存', html: '遭遇メモを書き込む前にマップURLやJSONファイルを保存しておけば、プレイヤー配布用の綺麗な地図をいつでも出力できます。' },
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: '시드 값을 선택하고 그리드 및 건축 스타일을 설정하세요. 메모, 인쇄 또는 가상 탁자(VTT)용 연결된 지도 지도 생성합니다.',
7
+ seedLabel: '지도 시드 값',
8
+ seedHint: '동일한 설정에서 동일한 시드 값을 사용하면 정확히 같은 지도를 다시 재생성할 수 있습니다.',
9
+ randomSeed: '새 시드',
10
+ sizeLabel: '탐험 규모',
11
+ sizeCompact: '단발 세션 (원샷)',
12
+ sizeSession: '표준 세션',
13
+ sizeStronghold: '대규모 요새',
14
+ fineTuneGrid: '그리드 및 밀도 미세 조정',
15
+ columnsLabel: '열 (가로)',
16
+ rowsLabel: '행 (세로)',
17
+ densityLabel: '방 밀도',
18
+ densityHint: '밀도가 높을수록 더 많은 방과 이동 가능한 바닥 면적이 생성됩니다.',
19
+ styleLabel: '지도 건축 스타일',
20
+ dungeonStyle: '던전',
21
+ dungeonStyleHint: '단일 너비 복도가 있는 일반 석조 방.',
22
+ cavernStyle: '동굴',
23
+ cavernStyleHint: '곡선 형태의 불규칙한 자연 동굴.',
24
+ scifiStyle: 'SF 모듈',
25
+ scifiStyleHint: '2칸 너비 연결 통로가 있는 넓은 모듈.',
26
+ generate: '지도 생성하기',
27
+ mapRegionLabel: '생성된 던전 지도 및 내보내기 제어',
28
+ connectedBadge: '모든 방 연결 완료',
29
+ roomsLabel: '방 개수',
30
+ doorsLabel: '문 개수',
31
+ floorLabel: '바닥 커버리지',
32
+ legendFloor: '이동 가능한 바닥',
33
+ legendWall: '견고한 벽',
34
+ legendDoor: '문 / 해치',
35
+ editHint: '타일을 우클릭하여 편집',
36
+ editCell: '타일 편집',
37
+ paintFloor: '바닥',
38
+ paintWall: '벽',
39
+ paintDoor: '문',
40
+ mapData: '지도 데이터',
41
+ copyLink: '지도 링크 복사',
42
+ linkCopied: '링크 복사됨',
43
+ exportPng: 'PNG 다운로드',
44
+ exportSvg: 'SVG 다운로드',
45
+ exportJson: 'JSON 저장',
46
+ importJson: 'JSON 열기',
47
+ importError: '이 파일에는 유효한 던전 지도 설정이 포함되어 있지 않습니다.',
48
+ compactMap: '긴장감 있는 탐험',
49
+ balancedMap: '균형 잡힌 탐험',
50
+ sprawlingMap: '광활한 요새',
51
+ compactHint: '통로가 길어질수록 방 사이에 미지의 공간이 더 많이 남습니다.',
52
+ balancedHint: '방과 통로가 균형 있게 배치됩니다.',
53
+ sprawlingHint: '넓은 바닥 면적으로 전투 및 빠른 이동에 유리합니다.',
54
+ mapReady: '지도 범례',
55
+ dimensionsUnit: '그리드 칸',
56
+ };
57
+
58
+ const faq = [
59
+ {
60
+ question: '동일한 시드 값은 항상 동일한 지도를 생성하나요?',
61
+ answer: '네. 시드 값, 그리드 크기, 밀도, 건축 스타일은 결정론적입니다. 4가지 설정을 동일하게 사용하면 정확히 같은 지도가 재구성됩니다.',
62
+ },
63
+ {
64
+ question: '생성된 모든 방에 도달할 수 있나요?',
65
+ answer: '네. 방 배치 후 신장 트리 통로 연결이 수행되므로 이동 가능한 모든 공간이 하나의 연결된 지도를 이룹니다.',
66
+ },
67
+ {
68
+ question: '던전, 동굴, SF 스타일의 차이점은 무엇인가요?',
69
+ answer: '던전은 일반 석조 방을, 동굴은 자연스러운 곡선 방을, SF 스타일은 넓은 모듈과 2칸 너비 통로를 생성합니다.',
70
+ },
71
+ {
72
+ question: '가상 탁자(VTT)에는 어떤 형식으로 내보내야 하나요?',
73
+ answer: 'PNG가 가장 보편적입니다. SVG는 확대해도 선명함이 유지되며 벡터 프로그램에서 편집하기 용이합니다.',
74
+ },
75
+ {
76
+ question: '다른 사람과 내가 생성한 지도를 공유할 수 있나요?',
77
+ answer: '네. 지도 링크를 복사하거나 JSON 파일을 전달하면 동일한 지도를 즉시 로드할 수 있습니다.',
78
+ },
79
+ {
80
+ question: '몬스터나 보물 상자도 자동으로 배치되나요?',
81
+ answer: '아니요. 게임 마스터가 자유롭게 연출할 수 있도록 순수한 건축 평면도만 제공합니다.',
82
+ },
83
+ ];
84
+
85
+ const howTo = [
86
+ {
87
+ name: '그리드 크기 설정',
88
+ text: '메모 공간이나 VTT 화면 크기에 맞춰 열과 행 개수를 설정합니다.',
89
+ },
90
+ {
91
+ name: '건축 스타일 선택',
92
+ text: '던전, 동굴, SF 중 선택하고 방 밀도를 조절합니다.',
93
+ },
94
+ {
95
+ name: '생성 및 검토',
96
+ text: '시드 값을 입력하여 지도를 생성하고 통계를 확인합니다.',
97
+ },
98
+ {
99
+ name: '내보내기 및 공유',
100
+ text: 'PNG/SVG로 다운로드하거나 링크 및 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: '랜덤 던전 지도 생성기',
118
+ operatingSystem: 'All',
119
+ applicationCategory: 'UtilitiesApplication',
120
+ description: '모든 방이 연결된 랜덤 던전 지도를 결정론적으로 생성하는 툴.',
121
+ };
122
+
123
+ const howToSchema: WithContext<HowTo> = {
124
+ '@context': 'https://schema.org',
125
+ '@type': 'HowTo',
126
+ name: '연결된 던전 지도를 생성하는 방법',
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: 'random-dungeon-map-generator',
136
+ title: 'TRPG용 랜덤 던전 지도 생성기',
137
+ description: '던전, 동굴, SF 지도를 생성. 전 방 연결 보장, PNG 및 SVG 내보내기 지원.',
138
+ ui,
139
+ seo: [
140
+ { type: 'title', text: '재사용 가능한 시드로 재생성 가능한 던전 지도 만들기', level: 2 },
141
+ { type: 'paragraph', html: '실용적인 던전 지도는 무작위 노이즈 이상의 구조가 필요합니다. 모든 방이 통로로 연결되어야 하며, 그리드가 플레이 환경에 맞고 언제든 동일한 구조를 다시 불러올 수 있어야 합니다.' },
142
+ { type: 'title', text: '인쇄 및 가상 탁자(VTT) 환경에 맞춘 그리드 설정', level: 2 },
143
+ { type: 'paragraph', html: '작은 그리드는 종이 인쇄가 쉽고 짧은 세션에 적합하며, 큰 지도는 광범위한 탐험 공간을 제공합니다. 내보낸 이미지는 정사각형 그리드를 유지하여 VTT 격자 맞춤이 용이합니다.' },
144
+ {
145
+ type: 'table',
146
+ headers: ['그리드 크기', '주요 용도', '권장 밀도', '설계 메모'],
147
+ rows: [
148
+ ['20 × 16 칸', '단발 세션 (원샷)', '35 ~ 45', '인쇄하기 쉽고 직관적인 구조'],
149
+ ['36 × 26 칸', '표준 세션 던전', '45 ~ 55', '방과 통로의 균형이 우수함'],
150
+ ['52 × 38 칸', '대규모 복합 던전', '50 ~ 65', '다수의 세력 및 우회로 배치 가능'],
151
+ ],
152
+ },
153
+ { type: 'tip', title: '전투 스케일에 맞춘 공간 확보', html: '전체 지도 크기를 정하기 전에 가장 큰 전투 상황에 필요한 칸 수를 미리 계산하세요.' },
154
+ { type: 'title', text: '바닥 커버리지로 탐험 템포 조절하기', level: 2 },
155
+ { type: 'paragraph', html: '바닥 커버리지는 이동 가능한 바닥 면적 비율을 나타냅니다. 커버리지가 낮으면 긴장감이 고조되고, 높으면 전투가 활발하게 일어납니다.' },
156
+ {
157
+ type: 'list',
158
+ items: [
159
+ '<strong>긴장감 있는 탐험:</strong> 여백 공간을 활용해 고립감이나 비밀 통로를 연출합니다.',
160
+ '<strong>균형 잡힌 탐험:</strong> 조사 공간, 복도, 전투 방을 균형 있게 배치합니다.',
161
+ '<strong>광활한 요새:</strong> 시야가 확보되고 적 패트롤 경로가 복잡하게 교차하도록 구성합니다.',
162
+ ],
163
+ },
164
+ { type: 'title', text: '중립적인 평면도를 스토리의 무대로 변환', level: 2 },
165
+ { type: 'paragraph', html: '생성된 지도는 순수한 건축 구조만을 제공합니다. 각 방에 역할을 부여하고 단서와 함정을 배치하세요.' },
166
+ { type: 'tip', title: '메모 작성 전 설정 보존하기', html: '인카운터 메모를 적기 전에 지도 링크나 JSON을 저장하면 플레이어에게 깔끔한 지도를 제공할 수 있습니다.' },
167
+ ],
168
+ faq,
169
+ bibliography,
170
+ howTo,
171
+ schemas: [faqSchema, appSchema, howToSchema] as unknown as Record<string, unknown>[],
172
+ };