@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: 'Выберите сид, настройте сетку и стиль архитектуры. Сгенерируйте связную карту для заметок, печати или виртуального стола (VTT).',
|
|
7
|
+
seedLabel: 'Сид карты (Seed)',
|
|
8
|
+
seedHint: 'Повторно используйте тот же сид с теми же настройками, чтобы воссоздать точно такую же карту.',
|
|
9
|
+
randomSeed: 'Новый сид',
|
|
10
|
+
sizeLabel: 'Размер экспедиции',
|
|
11
|
+
sizeCompact: 'Разовая игра (One-shot)',
|
|
12
|
+
sizeSession: 'Обычная сессия',
|
|
13
|
+
sizeStronghold: 'Крупная крепость',
|
|
14
|
+
fineTuneGrid: 'Точная настройка сетки и плотности',
|
|
15
|
+
columnsLabel: 'Колонки',
|
|
16
|
+
rowsLabel: 'Строки',
|
|
17
|
+
densityLabel: 'Плотность комнат',
|
|
18
|
+
densityHint: 'Более высокая плотность добавляет больше комнат и доступной площади.',
|
|
19
|
+
styleLabel: 'Архитектура карты',
|
|
20
|
+
dungeonStyle: 'Подземелье (Dungeon)',
|
|
21
|
+
dungeonStyleHint: 'Каменные комнаты с узкими коридорами.',
|
|
22
|
+
cavernStyle: 'Пещера (Cavern)',
|
|
23
|
+
cavernStyleHint: 'Естественные гроты со сглаженными краями.',
|
|
24
|
+
scifiStyle: 'Sci-Fi',
|
|
25
|
+
scifiStyleHint: 'Широкие модули с двойными коридорами.',
|
|
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: 'Чем отличаются стили подземелья, пещеры и Sci-Fi?',
|
|
69
|
+
answer: 'Стиль подземелья использует прямоугольные каменные комнаты. Пещеры формируют округлые гроты. Стиль Sci-Fi предлагает широкие модули и двойные шлюзы.',
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
question: 'Какой формат экспортировать для виртуального стола (VTT)?',
|
|
73
|
+
answer: 'PNG - самый простой выбор для большинства VTT. 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: 'Выберите подземелье, пещеру или Sci-Fi и настройте плотность комнат.',
|
|
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: 'Детерминированный генератор карт подземелий со связными комнатами, дверями и экспортом в PNG/SVG.',
|
|
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: 'generator-sluchaynyh-kart-podzemeliy',
|
|
136
|
+
title: 'Генератор Случайных Карт Подземелий для НРИ',
|
|
137
|
+
description: 'Создавайте воспроизводимые карты подземелий, пещер и Sci-Fi со связными комнатами, дверями и экспортом 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 ячеек', 'Разовая игра (One-shot)', 'От 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
|
+
};
|
|
@@ -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: 'Välj ett frö (seed), ställ in rutnätet och välj en arkitekturstil. Generera en sammankopplad karta för anteckningar, utskrift eller VTT.',
|
|
7
|
+
seedLabel: 'Kartfrö (Seed)',
|
|
8
|
+
seedHint: 'Återanvänd samma frö med samma inställningar för att återställa exakt samma karta.',
|
|
9
|
+
randomSeed: 'Nytt frö',
|
|
10
|
+
sizeLabel: 'Expeditionsstorlek',
|
|
11
|
+
sizeCompact: 'Enstaka spelpass (One-shot)',
|
|
12
|
+
sizeSession: 'Vanligt spelpass',
|
|
13
|
+
sizeStronghold: 'Stort fäste',
|
|
14
|
+
fineTuneGrid: 'Finjustera rutnät och densitet',
|
|
15
|
+
columnsLabel: 'Kolumner',
|
|
16
|
+
rowsLabel: 'Rader',
|
|
17
|
+
densityLabel: 'Rumstäthet',
|
|
18
|
+
densityHint: 'Högre täthet lägger till fler rum och användbar golvyta.',
|
|
19
|
+
styleLabel: 'Kartarkitektur',
|
|
20
|
+
dungeonStyle: 'Dungeon',
|
|
21
|
+
dungeonStyleHint: 'Stenrum med enkla korridorer.',
|
|
22
|
+
cavernStyle: 'Grotta',
|
|
23
|
+
cavernStyleHint: 'Oregelbundna rum med rundade kanter.',
|
|
24
|
+
scifiStyle: 'Sci-Fi',
|
|
25
|
+
scifiStyleHint: 'Breda moduler med dubbla korridorer.',
|
|
26
|
+
generate: 'Rita karta',
|
|
27
|
+
mapRegionLabel: 'Genererad dungeonkarta och exportkontroller',
|
|
28
|
+
connectedBadge: 'Alla rum sammankopplade',
|
|
29
|
+
roomsLabel: 'Rum',
|
|
30
|
+
doorsLabel: 'Dörrar',
|
|
31
|
+
floorLabel: 'Golvtäckning',
|
|
32
|
+
legendFloor: 'Gångbart golv',
|
|
33
|
+
legendWall: 'Massiv vägg',
|
|
34
|
+
legendDoor: 'Dörr eller sluss',
|
|
35
|
+
editHint: 'Högerklicka på en cell för att redigera',
|
|
36
|
+
editCell: 'Redigera denna cell',
|
|
37
|
+
paintFloor: 'Golv',
|
|
38
|
+
paintWall: 'Vägg',
|
|
39
|
+
paintDoor: 'Dörr',
|
|
40
|
+
mapData: 'Kartdata',
|
|
41
|
+
copyLink: 'Kopiera kartlänk',
|
|
42
|
+
linkCopied: 'Länk kopierad',
|
|
43
|
+
exportPng: 'Ladda ner PNG',
|
|
44
|
+
exportSvg: 'Ladda ner SVG',
|
|
45
|
+
exportJson: 'Spara JSON',
|
|
46
|
+
importJson: 'Öppna JSON',
|
|
47
|
+
importError: 'Denna fil innehåller inte en giltig dungeonkonfiguration.',
|
|
48
|
+
compactMap: 'Spänd utforskning',
|
|
49
|
+
balancedMap: 'Balanserad expedition',
|
|
50
|
+
sprawlingMap: 'Öppet fäste',
|
|
51
|
+
compactHint: 'Längre korridorer lämnar mer okänt utrymme mellan rummen.',
|
|
52
|
+
balancedHint: 'Rum och korridorer delar utrymmet balanserat.',
|
|
53
|
+
sprawlingHint: 'Stor golvyta gynnar strid och snabb förflyttning.',
|
|
54
|
+
mapReady: 'Kartförklaring',
|
|
55
|
+
dimensionsUnit: 'rutnätsceller',
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const faq = [
|
|
59
|
+
{
|
|
60
|
+
question: 'Skapar samma frö alltid samma dungeonkarta?',
|
|
61
|
+
answer: 'Ja. Frö, rutnätsmått, täthet och stil bildar en deterministisk konfiguration. Att återanvända alla fyra inställningar återställer exakt samma rum och dörrar.',
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
question: 'Är alla genererade rum sammankopplade?',
|
|
65
|
+
answer: 'Ja. Rummen kopplas samman via en huvudrutt efter placering, vilket garanterar att hela golvytan bildar en sammanhängande karta.',
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
question: 'Vad skiljer stilarna dungeon, grotta och Sci-Fi?',
|
|
69
|
+
answer: 'Dungeon använder regelbundna stenrum. Grottor skapar rundade oregelbundna rum. Sci-Fi använder breda moduler med dubbla slussar.',
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
question: 'Vilket format bör jag exportera för ett virtuellt bord (VTT)?',
|
|
73
|
+
answer: 'PNG är det enklaste valet för de flesta VTT:er. SVG håller sig skarpt i alla storlekar och är lätt att redigera i vektorprogram.',
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
question: 'Kan någon annan återskapa min karta?',
|
|
77
|
+
answer: 'Ja. Kopiera kartlänken eller skicka JSON-filen. Mottagaren kan direkt läsa in samma konfiguration.',
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
question: 'Lägger denna generator till monster, fällor eller skatter?',
|
|
81
|
+
answer: 'Nej. Den skapar en neutral arkitektonisk ritning som spelledaren själv kan fylla med innehåll.',
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
|
|
85
|
+
const howTo = [
|
|
86
|
+
{
|
|
87
|
+
name: 'Ställ in rutnätet',
|
|
88
|
+
text: 'Välj antal kolumner och rader som passar dina anteckningar eller din VTT-scen.',
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
name: 'Välj arkitektur',
|
|
92
|
+
text: 'Välj dungeon, grotta eller Sci-Fi och justera rumstätheten.',
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
name: 'Generera och granska',
|
|
96
|
+
text: 'Ange ett frö, generera kartan och granska rum, dörrar och golvyta.',
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'Exportera eller dela',
|
|
100
|
+
text: 'Ladda ner PNG eller SVG för att spela, eller spara konfigurationen via länk eller 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: 'Slumpmässig Dungeonkartgenerator',
|
|
118
|
+
operatingSystem: 'All',
|
|
119
|
+
applicationCategory: 'UtilitiesApplication',
|
|
120
|
+
description: 'En deterministisk generator för dungeonkartor med sammankopplade rum, dörrar och lokala exporter.',
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
const howToSchema: WithContext<HowTo> = {
|
|
124
|
+
'@context': 'https://schema.org',
|
|
125
|
+
'@type': 'HowTo',
|
|
126
|
+
name: 'Hur du genererar en sammankopplad dungeonkarta',
|
|
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: 'slumpmassig-dungeonkart-generator',
|
|
136
|
+
title: 'Slumpmässig Dungeonkartgenerator för Rollspel',
|
|
137
|
+
description: 'Skapa återanvändbara kartor för dungeons, grottor och Sci-Fi med sammankopplade rum, dörrar och PNG/SVG-export.',
|
|
138
|
+
ui,
|
|
139
|
+
seo: [
|
|
140
|
+
{ type: 'title', text: 'Skapa en Spelbar Dungeonkarta med ett Återanvändbart Frö', level: 2 },
|
|
141
|
+
{ type: 'paragraph', html: 'En användbar slumpmässig dungeonkarta kräver mer än bara slumpmässigt visuellt brus. Varje rum måste kunna nås via korridorer, rutnätet måste passa spelytan och resultatet måste kunna återskapas när som helst på vilken enhet som helst. Denna generator behandlar fröet och inställningarna som en kompakt och deterministisk kartspecifikation. Om du behåller samma frö, kolumner, rader, täthet och arkitekturstil kommer exakt samma ritning att byggas upp igen senare.' },
|
|
142
|
+
{ type: 'title', text: 'Rutnätsstorlek för Utskrift och Virtuella Bord (VTT)', level: 2 },
|
|
143
|
+
{ type: 'paragraph', html: 'Att ställa in rutnätet är det första praktiska steget när du planerar ett spelpass. Ett litet rutnät är enkelt att skriva ut på papper för korta äventyr eller enstaka platser, medan en stor karta ger utrymme för omfattande utforskning, taktiska strider och flera fraktioner. Den exporterade bilden behåller perfekt kvadratiska celler så att den passar direkt på rutnätet i programvara för virtuella bord (VTT).' },
|
|
144
|
+
{
|
|
145
|
+
type: 'table',
|
|
146
|
+
headers: ['Rutnätsstorlek', 'Typisk användning', 'Starttäthet', 'Planeringsnotering'],
|
|
147
|
+
rows: [
|
|
148
|
+
['20 x 16 celler', 'Enstaka spelpass (One-shot)', '35 till 45', 'Lätt att skriva ut och snabb att läsa av på papper'],
|
|
149
|
+
['36 x 26 celler', 'Vanligt spelpass', '45 till 55', 'Balanserad rytm mellan rum och korridorer'],
|
|
150
|
+
['52 x 38 celler', 'Stort komplex', '50 till 65', 'Gott om utrymme för fraktioner och sidovägar'],
|
|
151
|
+
],
|
|
152
|
+
},
|
|
153
|
+
{ type: 'tip', title: 'Anpassa Kartan efter Stridsskalan', html: 'Räkna ut hur många celler som behövs för de största striderna innan du väljer slutlig storlek. En stor dungeon med pyttesmå rum känn trång, medan en kompakt karta med ett rymligt huvudrum möjliggör minnesvärda scener.' },
|
|
154
|
+
{ type: 'title', text: 'Tolka Golvtäckningen som Tempomarkör', level: 2 },
|
|
155
|
+
{ type: 'paragraph', html: 'Golvtäckningen visar hur stor procent av den rektangulära ytan som är gångbar. Låg täthet bygger spänning, isolering och osäkerhet mellan rummen. Medelhög täthet stödjer en stadig expeditionsrytm. Hög täthet skapar ett fäste där strider och patruller snabbt kan spridas till angränsande rum.' },
|
|
156
|
+
{
|
|
157
|
+
type: 'list',
|
|
158
|
+
items: [
|
|
159
|
+
'<strong>Spänd utforskning:</strong> använd tomma ytor för att antyda hemliga gångar eller isolering.',
|
|
160
|
+
'<strong>Balanserad expedition:</strong> varva undersökningsrum med korridorer och stridsrum.',
|
|
161
|
+
'<strong>Öppet fäste:</strong> planera fria siktlinjer, patrullrutter och sammankopplade händelser.',
|
|
162
|
+
],
|
|
163
|
+
},
|
|
164
|
+
{ type: 'title', text: 'Från Neutral Ritning till Äventyrsplats', level: 2 },
|
|
165
|
+
{ type: 'paragraph', html: 'Den genererade kartan ger avsiktligen bara grundläggande arkitektur. Ge varje rum en berättarmässig roll och placera ut ledtrådar, fällor, varelser och skatter enligt det syftet. Använd dörrar som strategiska beslutspunkter för spelarna.' },
|
|
166
|
+
{ type: 'tip', title: 'Spara Konfigurationen innan du Antecknar', html: 'Kopiera länken eller spara JSON-filen innan du lägger till anteckningar för att behålla en ren karta till spelarna utan att avslöja spelledarens hemligheter.' },
|
|
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: 'Bir tohum (seed) seçin, ızgarayı ayarlayın ve mimari stili belirleyin. Notlarınız, baskı veya sanal masaüstünüz (VTT) için bağlantılı bir harita oluşturun.',
|
|
7
|
+
seedLabel: 'Harita Tohumu (Seed)',
|
|
8
|
+
seedHint: 'Aynı haritayı tekrar oluşturmak için aynı ayarlarla aynı tohumu kullanın.',
|
|
9
|
+
randomSeed: 'Yeni tohum',
|
|
10
|
+
sizeLabel: 'Keşif Boyutu',
|
|
11
|
+
sizeCompact: 'Tek oturumluk (One-shot)',
|
|
12
|
+
sizeSession: 'Standart oturum',
|
|
13
|
+
sizeStronghold: 'Büyük kale',
|
|
14
|
+
fineTuneGrid: 'Izgara ve yoğunluk hassas ayarı',
|
|
15
|
+
columnsLabel: 'Sütunlar',
|
|
16
|
+
rowsLabel: 'Satırlar',
|
|
17
|
+
densityLabel: 'Oda Yoğunluğu',
|
|
18
|
+
densityHint: 'Daha yüksek yoğunluk daha fazla oda ve kullanılabilir zemin ekler.',
|
|
19
|
+
styleLabel: 'Harita Mimarisi',
|
|
20
|
+
dungeonStyle: 'Zindan (Dungeon)',
|
|
21
|
+
dungeonStyleHint: 'Tek genişlikte koridorlara sahip taş odalar.',
|
|
22
|
+
cavernStyle: 'Mağara (Cavern)',
|
|
23
|
+
cavernStyleHint: 'Yumuşatılmış kenarlı düzensiz doğal odalar.',
|
|
24
|
+
scifiStyle: 'Bilim Kurgu (Sci-Fi)',
|
|
25
|
+
scifiStyleHint: 'Çift genişlikte geçitlere sahip geniş modüller.',
|
|
26
|
+
generate: 'Haritayı Çiz',
|
|
27
|
+
mapRegionLabel: 'Oluşturulan zindan haritası ve dışa aktarma kontrolleri',
|
|
28
|
+
connectedBadge: 'Tüm odalar bağlantılı',
|
|
29
|
+
roomsLabel: 'Odalar',
|
|
30
|
+
doorsLabel: 'Kapılar',
|
|
31
|
+
floorLabel: 'Zemin Kaplaması',
|
|
32
|
+
legendFloor: 'Yürünebilir zemin',
|
|
33
|
+
legendWall: 'Dolu duvar',
|
|
34
|
+
legendDoor: 'Kapı veya hava kilidi',
|
|
35
|
+
editHint: 'Düzenlemek için bir hücreye sağ tıklayın',
|
|
36
|
+
editCell: 'Bu hücreyi düzenle',
|
|
37
|
+
paintFloor: 'Zemin',
|
|
38
|
+
paintWall: 'Duvar',
|
|
39
|
+
paintDoor: 'Kapı',
|
|
40
|
+
mapData: 'Harita Verileri',
|
|
41
|
+
copyLink: 'Harita bağlantısını kopyala',
|
|
42
|
+
linkCopied: 'Bağlantı kopyalandı',
|
|
43
|
+
exportPng: 'PNG İndir',
|
|
44
|
+
exportSvg: 'SVG İndir',
|
|
45
|
+
exportJson: 'JSON Kaydet',
|
|
46
|
+
importJson: 'JSON Aç',
|
|
47
|
+
importError: 'Bu dosya geçerli bir zindan haritası yapılandırması içermiyor.',
|
|
48
|
+
compactMap: 'Gergin Keşif',
|
|
49
|
+
balancedMap: 'Dengeli Keşif',
|
|
50
|
+
sprawlingMap: 'Açık Kale',
|
|
51
|
+
compactHint: 'Daha uzun koridorlar odalar arasında daha fazla bilinmeyen alan bırakır.',
|
|
52
|
+
balancedHint: 'Odalar ve koridorlar alanı dengeli şekilde paylaşır.',
|
|
53
|
+
sprawlingHint: 'Geniş zemin alanı çatışmaları ve hızlı hareketi kolaylaştırır.',
|
|
54
|
+
mapReady: 'Harita Göstergesi',
|
|
55
|
+
dimensionsUnit: 'ızgara hücresi',
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const faq = [
|
|
59
|
+
{
|
|
60
|
+
question: 'Aynı tohum her zaman aynı zindan haritasını mı oluşturur?',
|
|
61
|
+
answer: 'Evet. Tohum, ızgara boyutları, yoğunluk ve stil deterministik bir yapılandırma oluşturur. Aynı ayarları kullanmak birebir aynı haritayı üretir.',
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
question: 'Oluşturulan tüm odalar birbirine bağlı mıdır?',
|
|
65
|
+
answer: 'Evet. Odalar yerleştirildikten sonra bir ana rota ile birbirine bağlanır, böylece tüm yürünebilir alan tek bir harita oluşturur.',
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
question: 'Zindan, mağara ve Sci-Fi stilleri arasındaki fark nedir?',
|
|
69
|
+
answer: 'Zindan stili düzenli taş odalar kullanır. Mağaralar yuvarlatılmış doğal odalar oluşturur. Sci-Fi stili geniş modüller ve çift kapılar kullanır.',
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
question: 'Sanal masaüstü (VTT) için hangi formatı dışa aktarmalıyım?',
|
|
73
|
+
answer: 'PNG çoğu VTT için en basit seçenektir. SVG her ölçekte keskin kalır ve vektör yazılımlarında kolayca düzenlenir.',
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
question: 'Başka biri benim haritamı tekrar üretebilir mi?',
|
|
77
|
+
answer: 'Evet. Harita bağlantısını kopyalayın veya JSON dosyasını gönderin. Alıcı aynı haritayı anında yükleyebilir.',
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
question: 'Bu oluşturucu canavar, tuzak veya hazine ekler mi?',
|
|
81
|
+
answer: 'Hayır. Herhangi bir oyun kuralına göre içini doldurabilmeniz için tarafsız bir mimari kat planı oluşturur.',
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
|
|
85
|
+
const howTo = [
|
|
86
|
+
{
|
|
87
|
+
name: 'Izgara boyutlarını ayarlayın',
|
|
88
|
+
text: 'Notlarınıza veya VTT sahnenize uygun sütun ve satır sayısını seçin.',
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
name: 'Mimariyi seçin',
|
|
92
|
+
text: 'Zindan, mağara veya Sci-Fi seçin ve oda yoğunluğunu ayarlayın.',
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
name: 'Oluşturun ve inceleyin',
|
|
96
|
+
text: 'Bir tohum girin, haritayı çizin ve oda ile kapı özetini inceleyin.',
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'Dışa aktarın veya paylaşın',
|
|
100
|
+
text: 'Oynamak için PNG veya SVG indirin ya da bağlantı/JSON ile paylaşın.',
|
|
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: 'Rastgele Zindan Haritası Oluşturucu',
|
|
118
|
+
operatingSystem: 'All',
|
|
119
|
+
applicationCategory: 'UtilitiesApplication',
|
|
120
|
+
description: 'Tüm odaları bağlantılı deterministik rastgele zindan haritası oluşturucu.',
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
const howToSchema: WithContext<HowTo> = {
|
|
124
|
+
'@context': 'https://schema.org',
|
|
125
|
+
'@type': 'HowTo',
|
|
126
|
+
name: 'Bağlantılı bir zindan haritası nasıl oluşturulur',
|
|
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: 'rastgele-zindan-haritasi-olusturucu',
|
|
136
|
+
title: 'Masaüstü RPG için Rastgele Zindan Haritası Oluşturucu',
|
|
137
|
+
description: 'Bağlantılı odalara, kapılara ve PNG/SVG dışa aktarımına sahip tekrar üretilebilir zindan haritaları oluşturun.',
|
|
138
|
+
ui,
|
|
139
|
+
seo: [
|
|
140
|
+
{ type: 'title', text: 'Tekrar Kullanılabilir Tohum ile Oynanabilir Zindan Haritası Oluşturun', level: 2 },
|
|
141
|
+
{ type: 'paragraph', html: 'Kullanışlı bir rastgele zindan haritası sadece rastgele görsel gürültüden fazlasını gerektirir. Her oda bağlantılı koridorlarla erişilebilir olmalı, ızgara oyun alanına uymalı ve sonuç istendiğinde her cihazda tekrar üretilebilmelidir. Bu oluşturucu tohumu ve ayarları kompakt ve deterministik bir harita spesifikasyonu olarak ele alır. Aynı tohumu, sütunları, satırları, yoğunluğu ve mimari stili koruduğunuzda aynı haritayı tekrar oluşturursunuz.' },
|
|
142
|
+
{ type: 'title', text: 'Baskı ve Sanal Masaüstü (VTT) için Izgara Boyutları', level: 2 },
|
|
143
|
+
{ type: 'paragraph', html: 'Izgara boyutunu ayarlamak bir oturumu planlarken ilk pratik adımdır. Küçük bir ızgarayı kağıda basmak kolaydır ve kısa maceralar veya tek mekanlar için idealdir, büyük bir harita ise karmaşık keşifler, taktiksel çatışmalar ve çoklu gruplar için geniş alan sunar. Dışa aktarılan görsel, sanal masaüstü (VTT) yazılımlarındaki ızgara ayarlarıyla mükemmel uyum sağlamak için kare hücreleri korur.' },
|
|
144
|
+
{
|
|
145
|
+
type: 'table',
|
|
146
|
+
headers: ['Izgara boyutu', 'Tipik kullanım', 'Başlangıç yoğunluğu', 'Planlama notu'],
|
|
147
|
+
rows: [
|
|
148
|
+
['20 x 16 hücre', 'Tek oturumluk (One-shot)', '35 - 45', 'Baskısı kolay ve kağıt üzerinde hızlı okunabilir'],
|
|
149
|
+
['36 x 26 hücre', 'Standart oturum', '45 - 55', 'Oda ve koridor ritmi dengeli'],
|
|
150
|
+
['52 x 38 hücre', 'Büyük kompleks', '50 - 65', 'Çoklu gruplar ve alternatif yollar için geniş alan'],
|
|
151
|
+
],
|
|
152
|
+
},
|
|
153
|
+
{ type: 'tip', title: 'Haritayı Çatışma Ölçeğine Uyarlayın', html: 'Toplam boyutu seçmeden önce büyük çatışmalar için gereken hücre sayısını hesaplayın. Küçük odalara sahip büyük bir zindan basık hissettirir, geniş bir ana odaya sahip kompakt bir plan ise unutulmaz sahnelere imkan tanır.' },
|
|
154
|
+
{ type: 'title', text: 'Zemin Kaplamasını Oyun Temposu Olarak Değerlendirin', level: 2 },
|
|
155
|
+
{ type: 'paragraph', html: 'Zemin kaplaması dikdörtgen alanın yüzde kaçının yürünebilir olduğunu gösterir. Düşük yoğunluk odalar arasında gerilim, izolasyon ve bilinmezlik oluşturur. Orta yoğunluk istikrarlı bir keşif temposunu destekler. Yüksek yoğunluk ise çatışmaların ve devriyelerin yakındaki odalara hızla yayılabileceği bir kale kompleksi oluşturur.' },
|
|
156
|
+
{
|
|
157
|
+
type: 'list',
|
|
158
|
+
items: [
|
|
159
|
+
'<strong>Gergin keşif:</strong> gizli geçitleri ve izolasyonu hissettirmek için boş alanları kullanın.',
|
|
160
|
+
'<strong>Dengeli keşif:</strong> araştırma odaları ile koridorları dengeli şekilde sıralayın.',
|
|
161
|
+
'<strong>Açık kale:</strong> net görüş hatları, devriye rotaları ve birbirine bağlı karşılaşmalar hazırlayın.',
|
|
162
|
+
],
|
|
163
|
+
},
|
|
164
|
+
{ type: 'title', text: 'Tarafsız Bir Kat Planını Macera Alanına Dönüştürün', level: 2 },
|
|
165
|
+
{ type: 'paragraph', html: 'Oluşturulan harita kasıtlı olarak sadece temel mimariyi sağlar. Her ana odaya anlatısal bir rol verin ve ipuçlarını, tuzakları, yaratıkları ve hazineleri bu amaca göre yerleştirin. Kapıları oyuncular için stratejik karar noktaları olarak kullanın.' },
|
|
166
|
+
{ type: 'tip', title: 'Not Eklemeden Önce Yapılandırmayı Kaydedin', html: 'Oyunculara Oyun Yöneticisi sırlarını ifşa etmeden temiz bir harita sunabilmek için karşılaşma notları eklemeden önce bağlantıyı kopyalayın veya JSON dosyasını kaydedin.' },
|
|
167
|
+
],
|
|
168
|
+
faq,
|
|
169
|
+
bibliography,
|
|
170
|
+
howTo,
|
|
171
|
+
schemas: [faqSchema, appSchema, howToSchema] as unknown as Record<string, unknown>[],
|
|
172
|
+
};
|