@jjlmoya/utils-tabletop 1.29.0 → 1.31.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 (38) 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/tests/locale_completeness.test.ts +2 -9
  5. package/src/tests/tool_validation.test.ts +1 -2
  6. package/src/tool/rpg-settlement-exploration-map-generator/.keep +1 -0
  7. package/src/tool/rpg-settlement-exploration-map-generator/bibliography.astro +11 -0
  8. package/src/tool/rpg-settlement-exploration-map-generator/bibliography.ts +7 -0
  9. package/src/tool/rpg-settlement-exploration-map-generator/component.astro +66 -0
  10. package/src/tool/rpg-settlement-exploration-map-generator/controller.ts +231 -0
  11. package/src/tool/rpg-settlement-exploration-map-generator/dom-views.ts +174 -0
  12. package/src/tool/rpg-settlement-exploration-map-generator/editor.ts +85 -0
  13. package/src/tool/rpg-settlement-exploration-map-generator/entry.ts +27 -0
  14. package/src/tool/rpg-settlement-exploration-map-generator/evaluator.ts +8 -0
  15. package/src/tool/rpg-settlement-exploration-map-generator/i18n/de.ts +152 -0
  16. package/src/tool/rpg-settlement-exploration-map-generator/i18n/en.ts +63 -0
  17. package/src/tool/rpg-settlement-exploration-map-generator/i18n/es.ts +233 -0
  18. package/src/tool/rpg-settlement-exploration-map-generator/i18n/fr.ts +152 -0
  19. package/src/tool/rpg-settlement-exploration-map-generator/i18n/id.ts +152 -0
  20. package/src/tool/rpg-settlement-exploration-map-generator/i18n/it.ts +152 -0
  21. package/src/tool/rpg-settlement-exploration-map-generator/i18n/ja.ts +152 -0
  22. package/src/tool/rpg-settlement-exploration-map-generator/i18n/ko.ts +152 -0
  23. package/src/tool/rpg-settlement-exploration-map-generator/i18n/nl.ts +152 -0
  24. package/src/tool/rpg-settlement-exploration-map-generator/i18n/pl.ts +152 -0
  25. package/src/tool/rpg-settlement-exploration-map-generator/i18n/pt.ts +152 -0
  26. package/src/tool/rpg-settlement-exploration-map-generator/i18n/ru.ts +152 -0
  27. package/src/tool/rpg-settlement-exploration-map-generator/i18n/sv.ts +152 -0
  28. package/src/tool/rpg-settlement-exploration-map-generator/i18n/tr.ts +152 -0
  29. package/src/tool/rpg-settlement-exploration-map-generator/i18n/zh.ts +152 -0
  30. package/src/tool/rpg-settlement-exploration-map-generator/index.ts +4 -0
  31. package/src/tool/rpg-settlement-exploration-map-generator/logic.test.ts +65 -0
  32. package/src/tool/rpg-settlement-exploration-map-generator/logic.ts +288 -0
  33. package/src/tool/rpg-settlement-exploration-map-generator/rpg-settlement-exploration-map-generator.css +885 -0
  34. package/src/tool/rpg-settlement-exploration-map-generator/seo.astro +11 -0
  35. package/src/tool/rpg-settlement-exploration-map-generator/storage.test.ts +12 -0
  36. package/src/tool/rpg-settlement-exploration-map-generator/storage.ts +24 -0
  37. package/src/tool/rpg-settlement-exploration-map-generator/ui.ts +81 -0
  38. package/src/tools.ts +2 -0
@@ -0,0 +1,152 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
3
+ import type { SettlementMapLocaleContent, SettlementMapUI } from '../entry';
4
+
5
+ const ui: SettlementMapUI = {
6
+ intro: 'Generera och redigera bostads- och utforskningskartor för rollspel. Välj terräng, storlek, arkitekturstil och redigera rutor direkt via kontextmenyn.',
7
+ seedLabel: 'Genereringsfrö och namn på bosättningen',
8
+ seedHint: 'Bestämmer ett slumpmässigt men reproducerbart mönster av gator och byggnader.',
9
+ randomSeed: 'Slumpa nytt namn',
10
+ environmentLabel: 'Omgivande terräng',
11
+ forest: 'Skog',
12
+ plains: 'Slätt',
13
+ coast: 'Kust',
14
+ river: 'Flod',
15
+ mountain: 'Berg',
16
+ styleLabel: 'Arkitekturstil',
17
+ styleHint: 'Ändrar utseendet på tak, väggar, byggnadsmaterial och växtlighet i bosättningen.',
18
+ styleTimber: 'Korsvirke',
19
+ styleStone: 'Sten',
20
+ styleCoastal: 'Kustnära',
21
+ styleHighland: 'Högland',
22
+ styleMedieval: 'Medeltida',
23
+ styleEdo: 'Edo',
24
+ styleSahelian: 'Sahel',
25
+ sizeLabel: 'Storlek på bosättningen',
26
+ hamlet: 'Liten by',
27
+ hamletHint: 'Litet vägskäl',
28
+ village: 'By',
29
+ villageHint: 'Lokalt centrum',
30
+ town: 'Stad',
31
+ townHint: 'Livlig knutpunkt',
32
+ homesLabel: 'Antal bostäder',
33
+ homesHint: 'Justerar antalet bostadshus inom den valda storlekskategorin.',
34
+ servicesLabel: 'Inrättningar och landmärken',
35
+ serviceListHint: 'Välj standardbyggnader eller lägg till dina egna namngivna platser.',
36
+ newServicePlaceholder: 'Ange platsens namn',
37
+ addService: 'Lägg till',
38
+ removeService: 'Ta bort',
39
+ serviceTavern: 'Värdshus',
40
+ serviceSmithy: 'Smedja',
41
+ serviceTemple: 'Tempel',
42
+ serviceMarket: 'Marknad',
43
+ serviceStable: 'Stall',
44
+ serviceHall: 'Rådhus',
45
+ generate: 'Omgenerera karta',
46
+ mapRegionLabel: 'Redigerbar bosättningskarta för rollspel',
47
+ mapSummary: 'Plan över bosättningen',
48
+ buildings: 'Byggnader',
49
+ paths: 'Vägar',
50
+ services: 'Inrättningar',
51
+ terrain: 'Vatten',
52
+ legendLabel: 'Karttecken',
53
+ legendHome: 'Bostad',
54
+ legendService: 'Inrättning',
55
+ legendPath: 'Väg',
56
+ legendWater: 'Vatten',
57
+ legendWild: 'Skog',
58
+ editLabel: 'Direkt ruteditering',
59
+ toolSelect: 'Inspektera',
60
+ toolBuilding: 'Byggnad',
61
+ toolPath: 'Väg',
62
+ toolWater: 'Vatten',
63
+ toolTree: 'Träd',
64
+ toolErase: 'Radera',
65
+ serviceSelectLabel: 'Ny inrättningsetikett',
66
+ clickHint: 'Högerklicka eller håll tryckt på en ruta för att öppna åtgärdsmenyn.',
67
+ selectedHint: 'Vald ruta:',
68
+ shareLink: 'Kopiera länk',
69
+ linkCopied: 'Länken har kopierats till urklipp',
70
+ exportPng: 'PNG',
71
+ exportSvg: 'SVG',
72
+ exportJson: 'Spara JSON',
73
+ importJson: 'Öppna JSON',
74
+ importError: 'Ogiltig fil för bosättningskarta.',
75
+ mapData: 'Kartdata',
76
+ readyBadge: 'Klar för utforskning',
77
+ serviceNone: 'Ingen etikett',
78
+ contextMenuLabel: 'Meny för ruta',
79
+ contextInspect: 'Inspektera ruta',
80
+ contextBuilding: 'Lägg till byggnad',
81
+ contextPath: 'Lägg till väg',
82
+ contextWater: 'Lägg till vatten',
83
+ contextTree: 'Lägg till träd',
84
+ contextErase: 'Radera ruta',
85
+ };
86
+
87
+ const faq = [
88
+ { question: 'Vad kan man skapa med denna kartgenerator för rollspel och bosättningar?', answer: 'Du kan generera detaljerade och överskådliga kartor över byar, samhällen och städer för dina rollspelsäventyr och din världsuppbyggnad. Byggnader, vägar, vatten och växtlighet placeras ut automatiskt enligt logiska regler.' },
89
+ { question: 'Ändras kartan om man byter genereringsfrö (seed)?', answer: 'Ja. Samma frö och inställningar ger exakt samma ursprungskarta varje gång. Detta gör det enkelt att spara kartor i dina anteckningar och dela dem med dina spelare.' },
90
+ { question: 'Vilka storlekar på bosättningar finns tillgängliga?', answer: 'Du kan välja mellan tre storlekar: liten by, by och stad. Tätheten i bebyggelsen, vägnätet och infrastrukturen skalas automatiskt.' },
91
+ { question: 'Kan man anpassa arkitekturstilen?', answer: 'Ja, det finns 7 stilar: Medeltida, Edo, Sahel, Korsvirke, Sten, Kustnära och Högland. Stilen ändrar utseendet på tak, väggar och växtlighet.' },
92
+ { question: 'Finns det olika terrängtyper för omgivningen?', answer: 'Du kan placera bosättningen i skog, på slätt, vid kusten, intill en flod eller i bergen för att passa in i din världskarta.' },
93
+ { question: 'Hur placeras inrättningar som värdshus ut?', answer: 'Värdshus, smedjor och marknader fördelas med hjälp av viktade algoritmer i centrum eller i utkanten av bosättningen.' },
94
+ { question: 'Kan man lägga till sina egna unika platser?', answer: 'Ja, du kan lägga till egna namngivna platser som visas som tydliga skyltar ovanför byggnaderna och sparas i kartan.' },
95
+ { question: 'Kan man redigera kartan manuellt?', answer: 'Självklart. Via kontextmenyn på valfri ruta kan du direkt lägga till eller ta bort byggnader, vägar, vatten och träd.' },
96
+ { question: 'Hur kopplas vägar och vatten ihop vid redigering?', answer: 'Vägkorsningar och närliggande vattenrutor sammanfogas automatiskt till mjuka former utan skarpa eller ojämna kanter.' },
97
+ { question: 'Hur sparar eller delar man sin karta?', answer: 'Du kan kopiera en direktlänk eller spara hela kartan som en JSON-fil för framtida laddning och redigering.' },
98
+ { question: 'Vilka exportformat stöds?', answer: 'PNG för digitala spelbord (VTT), SVG för tryck och vektorgrafik, samt JSON för att spara alla redigerbara kartdata.' },
99
+ ];
100
+
101
+ const howTo = [
102
+ { name: 'Välj genereringsfrö', text: 'Använd det slumpade namnet eller skriv in ett eget ord för att skapa det initiala mönstret.' },
103
+ { name: 'Välj terräng och stil', text: 'Anpassa omgivningen och arkitekturen efter stämningen i din kampanj.' },
104
+ { name: 'Ställ in bosättningens storlek', text: 'Välj liten by, by eller stad och justera vid behov antalet bostadshus.' },
105
+ { name: 'Lägg till inrättningar', text: 'Aktivera standardbyggnader eller lägg till dina egna unika namngivna platser.' },
106
+ { name: 'Redigera rutor', text: 'Använd kontextmenyn för att göra direkta ändringar i vägar, byggnader eller vatten.' },
107
+ { name: 'Exportera och dela', text: 'Kopiera länken eller spara din karta i formaten PNG, SVG eller JSON.' },
108
+ ];
109
+
110
+ const faqSchema: WithContext<FAQPage> = { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
111
+ const appSchema: WithContext<SoftwareApplication> = { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: 'Kartgenerator för bosättningar och rollspel', operatingSystem: 'All', applicationCategory: 'GameApplication', description: 'Webbaserad kartgenerator för bosättningar i rollspel med reproducerbara frön och ruteditering.' };
112
+ const howToSchema: WithContext<HowTo> = { '@context': 'https://schema.org', '@type': 'HowTo', name: 'Hur du skapar en bosättningskarta för rollspel', step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })) };
113
+
114
+ const schemas: WithContext<SoftwareApplication | FAQPage | HowTo>[] = [faqSchema, appSchema, howToSchema];
115
+
116
+ export const content: SettlementMapLocaleContent = {
117
+ slug: 'kartgenerator-bosattningar-rollspel-utforskning',
118
+ title: 'Kartgenerator för bosättningar och rollspel',
119
+ description: 'Skapa kartor över byar och städer för rollspel med reproducerbara frön, 7 stilar och direkt ruteditering.',
120
+ ui,
121
+ seo: [
122
+ { type: 'title', text: 'Skapa levande bosättningar för rollspel', level: 2 },
123
+ { type: 'paragraph', html: 'Designa kompletta byar, små samhällen och städer med genomtänkta vägnät, centrala torg och nyckelbyggnader för dina bordsrollspel och din världsuppbyggnad. Denna webbaserade kartgenerator skapar tydliga kartor ur fågelperspektiv där bostäder, vägar, marknadsplatser, vattendrag och grönområden möts i en sammanhängande, detaljrik och övertygande miljö. Det är det perfekta verktyget för ett snabbt stopp längs vägen, spelarnas startby, ett gilleshögkvarter eller ett stort handelscentrum fyllt av rivaliserande fraktioner, hemligheter, intriger och spännande uppdrag. Varje genererad plats känns levande, naturlig, stämningsfull och helt redo för ett engagerande och minnesvärt spelsammanträde.' },
124
+ { type: 'title', text: 'Reproducerbara genereringsfrön', level: 2 },
125
+ { type: 'paragraph', html: 'Varje genererad bosättning bygger på ett ihågkommeligt textbaserat frö (seed). Exakt samma frö och inställningar garanterar att ursprungskartan återskapas identiskt varje gång. Detta är oerhört praktiskt för spelledare som vill spara sina detaljerade anteckningar för framtida spelsessioner eller dela en färdig karta med andra utan risk för avvikelser i den grundläggande layouten. Genom att byta frö upptäcker du omedelbart ett helt nytt, unikt mönster av gator och bebyggelse samtidigt som du behåller full kontroll över skapandet av din fantastiska värld.' },
126
+ { type: 'list', items: ['Ett nytt frö skapar ett unikt mönster av vägar och hus inom vald storlek.', 'Full reproducerbarhet för spelledarens anteckningar och kampanjmaterial.', 'Bevarar logisk stadsplanering och rumsliga proportioner i kartan.', 'Smidig delning med spelare som en stabil utgångspunkt för äventyret.'] },
127
+ { type: 'title', text: 'Skala från liten by till livlig stad', level: 2 },
128
+ { type: 'paragraph', html: 'Välj från små vägkorsningar och torp till större städer med varierande bebyggelsetäthet och vägmönster som matchar bosättningens storlek. Varje storlekskategori har sin egen interna byggnadslogik och sitt spann för antalet bostadshus, vilket skapar en perfekt scen för äventyr och utforskning.' },
129
+ { type: 'table', headers: ['Storlek', 'Bostäder', 'Karaktär', 'Användning i kampanjen'], rows: [['Liten by', '3-18', 'Liten och lugn', 'Vägskäl eller isolerad bosättning'], ['By', '4-28', 'Lokalt centrum', 'Spelarnas bas och startplats'], ['Stad', '6-42', 'Tät och livlig', 'Regional handelsknutpunkt och utredningar']] },
130
+ { type: 'title', text: 'Sju arkitekturstilar för rätt stämning', level: 2 },
131
+ { type: 'paragraph', html: 'Ge varje bosättning en unik visuella identitet och atmosfär. Medeltida, Edo, Sahel, Korsvirke, Sten, Kustnära och Högland ändrar tak, väggmaterial, färgaccenter och omgivande växtlighet för att exakt spegla kulturen och geografin i regionen i din fantasyvärld. Varje arkitektonisk detalj förstärker känslan av platsen.' },
132
+ { type: 'list', items: ['Medeltida och Korsvirke för klassisk fantasy och skogsbyar.', 'Sten och Högland för karga bergsområden, fästningar och utposter.', 'Kustnära för hamnsamhällen med karaktäristisk kustflora och träbryggor.', 'Edo för österländska miljöer, träkonstruktioner och stiltypiska tak.', 'Sahel för varma regioner, lertegelbyggnader och ökenoaser.'] },
133
+ { type: 'title', text: 'Smart placering av inrättningar och skyltar', level: 2 },
134
+ { type: 'paragraph', html: 'Värdshus, smedjor, tempel och rådhus fördelas automatiskt med hänsyn till bebyggelsens logik mellan centrum och utkanten baserat på viktade algoritmer. Dina egna tillagda platser visas som tydliga och lättlästa skyltar direkt ovanför byggnaderna, vilket underlättar orienteringen under spelets gång och ökar spelarnas inlevelse.' },
135
+ { type: 'title', text: 'Integration med världens terräng', level: 2 },
136
+ { type: 'paragraph', html: 'Placera bosättningar i skog, på slätt, vid kusten, intill en flod eller i bergen för att naturally smälta samman med den omgivande vildmarken på din världskarta. Växtlighet och vattendrag anpassas automatiskt efter den valda naturzonen.' },
137
+ { type: 'title', text: 'Direkt ruteditering i webbläsaren', level: 2 },
138
+ { type: 'paragraph', html: 'Lägg till och ta bort hus, vägar, vatten och träd enkelt via högerklick eller långtryck på mobila enheter. Anpassa kartan efter de specifika behoven i ditt äventyr och lägg till nyckelplatser direkt i stunden utan att behöva externa bildredigeringsprogram eller komplicerade verktyg.' },
139
+ { type: 'list', items: ['Lägg till viktiga platser, vakttorn eller palissader.', 'Snabb redigering utan externa grafikprogram.', 'Spara alla manuella ändringar direkt i kartdata.', 'Smidig funktion på datorer, surfplattor och mobiler.'] },
140
+ { type: 'title', text: 'Dynamiska vägar och vattenanslutningar', level: 2 },
141
+ { type: 'paragraph', html: 'Vägkorsningar och närliggande vattenrutor kopplas automatiskt samman till mjuka, estetiska och naturliga shapes utan skarpa kanter, vilket ger en ren och professionell karta över din bosättning.' },
142
+ { type: 'title', text: 'Spara och dela för framtida spelsessioner', level: 2 },
143
+ { type: 'paragraph', html: 'Kopiera enkelt en direktlänk för redigering eller spara hela kartan som en JSON-fil så att du kan fortsätta arbeta med din bosättning under kommande spelkvällar utan att förlora några viktiga detaljer.' },
144
+ { type: 'title', text: 'Exportformat för alla behov', level: 2 },
145
+ { type: 'table', headers: ['Format', 'Användning', 'Innehåll'], rows: [['PNG', 'Digitala spelbord (VTT) och anteckningar', 'Högupplöst bild'], ['SVG', 'Tryck och vektorgrafik', 'Skarp vektor utan kvalitetstapp'], ['JSON', 'Vidare redigering', 'Komplett data för alla kartans rutor']] },
146
+ { type: 'tip', title: 'Tips för spelledarens förberedelser', html: 'Välj frö, storlek och terräng, lägg till nyckelplatser och gör sista finjusteringarna i kartan innan spelsessionen börjar.' },
147
+ ],
148
+ faq,
149
+ bibliography,
150
+ howTo,
151
+ schemas,
152
+ };
@@ -0,0 +1,152 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
3
+ import type { SettlementMapLocaleContent, SettlementMapUI } from '../entry';
4
+
5
+ const ui: SettlementMapUI = {
6
+ intro: 'Masaüstü rol yapma oyunları için yerleşim haritaları oluşturun ve düzenleyin. Arazi, boyut, mimari stil seçin ve hücreleri bağlam menüsünden düzenleyin.',
7
+ seedLabel: 'Üretim Tohumu ve Yerleşim Adı',
8
+ seedHint: 'Rastgele fakat aynı tohumla yeniden elde edilebilir bir sokak ve bina düzeni belirler.',
9
+ randomSeed: 'Yeni Ad Rastgele',
10
+ environmentLabel: 'Çevre Arazisi',
11
+ forest: 'Orman',
12
+ plains: 'Ova',
13
+ coast: 'Sahil',
14
+ river: 'Nehir',
15
+ mountain: 'Dağ',
16
+ styleLabel: 'Mimari Stil',
17
+ styleHint: 'Yerleşimin çatı, duvar, bina malzemeleri ve bitki örtüsü görünümünü değiştirir.',
18
+ styleTimber: 'Ahşap Karkas',
19
+ styleStone: 'Taş Yapı',
20
+ styleCoastal: 'Kıyı Mimarisi',
21
+ styleHighland: 'Yayla Mimarisi',
22
+ styleMedieval: 'Orta Çağ',
23
+ styleEdo: 'Edo Dönemi',
24
+ styleSahelian: 'Sahel Stili',
25
+ sizeLabel: 'Yerleşim Boyutu',
26
+ hamlet: 'Mezra',
27
+ hamletHint: 'Küçük Konaklama',
28
+ village: 'Köy',
29
+ villageHint: 'Yerel Merkez',
30
+ town: 'Kasaba',
31
+ townHint: 'Hareketli Merkez',
32
+ homesLabel: 'Ev Sayısı',
33
+ homesHint: 'Seçilen boyut kategorisi içindeki konut sayısını ayarlar.',
34
+ servicesLabel: 'Mekanlar ve Önemli Yapılar',
35
+ serviceListHint: 'Varsayılan binaları seçin veya kendi özel isimli mekanlarınızı ekleyin.',
36
+ newServicePlaceholder: 'Mekan adı girin',
37
+ addService: 'Ekle',
38
+ removeService: 'Kaldır',
39
+ serviceTavern: 'Han',
40
+ serviceSmithy: 'Demirci',
41
+ serviceTemple: 'Tapınak',
42
+ serviceMarket: 'Pazar',
43
+ serviceStable: 'Ahır',
44
+ serviceHall: 'Belediye',
45
+ generate: 'Haritayı Yeniden Üret',
46
+ mapRegionLabel: 'Düzenlenebilir FRP Yerleşim Haritası',
47
+ mapSummary: 'Yerleşim Planı',
48
+ buildings: 'Binalar',
49
+ paths: 'Yollar',
50
+ services: 'Mekanlar',
51
+ terrain: 'Su',
52
+ legendLabel: 'Harita Lejantı',
53
+ legendHome: 'Ev',
54
+ legendService: 'Mekan',
55
+ legendPath: 'Yol',
56
+ legendWater: 'Su',
57
+ legendWild: 'Orman',
58
+ editLabel: 'Doğrudan Hücre Düzenleme',
59
+ toolSelect: 'İncele',
60
+ toolBuilding: 'Bina',
61
+ toolPath: 'Yol',
62
+ toolWater: 'Su',
63
+ toolTree: 'Ağaç',
64
+ toolErase: 'Sil',
65
+ serviceSelectLabel: 'Yeni Mekan Etiketi',
66
+ clickHint: 'Eylem menüsünü açmak için bir hücreye sağ tıklayın veya uzun basın.',
67
+ selectedHint: 'Seçili Hücre:',
68
+ shareLink: 'Bağlantıyı Kopyala',
69
+ linkCopied: 'Bağlantı panoya kopyalandı',
70
+ exportPng: 'PNG',
71
+ exportSvg: 'SVG',
72
+ exportJson: 'JSON Kaydet',
73
+ importJson: 'JSON Aç',
74
+ importError: 'Geçersiz yerleşim haritası dosyası.',
75
+ mapData: 'Harita Verisi',
76
+ readyBadge: 'Keşfe Hazır',
77
+ serviceNone: 'Etiketsiz',
78
+ contextMenuLabel: 'Hücre Menüsü',
79
+ contextInspect: 'Hücreyi İncele',
80
+ contextBuilding: 'Bina Ekle',
81
+ contextPath: 'Yol Ekle',
82
+ contextWater: 'Su Ekle',
83
+ contextTree: 'Ağaç Ekle',
84
+ contextErase: 'Hücreyi Sil',
85
+ };
86
+
87
+ const faq = [
88
+ { question: 'Bu FRP yerleşim haritası üreteci ile neler oluşturulabilir?', answer: 'Rol yapma oyunlarınız ve dünya oluşturma süreçleriniz için ayrıntılı ve anlaşılır köy, kasaba ve yerleşim planları üretebilirsiniz. Binalar, yollar, su kütleleri ve bitki örtüsü mantıklı kurallarla otomatik yerleştirilir.' },
89
+ { question: 'Tohum (seed) değiştirildiğinde harita planı değişir mi?', answer: 'Evet. Aynı tohum ve ayarlar her defasında birebir aynı başlangıç haritasını verir. Bu sayede haritaları notlarınızda kolayca saklayabilir ve oyuncularınızla paylaşabilirsiniz.' },
90
+ { question: 'Hangi yerleşim boyutları mevcuttur?', answer: 'Mezra, köy ve kasaba olmak üzere üç farklı boyut seçebilirsiniz. Yerleşim yoğunluğu, yol ağı ve altyapı otomatik olarak ölçeklenir.' },
91
+ { question: 'Mimari stili özelleştirmek mümkün müdür?', answer: 'Evet, 7 stil mevcuttur: Orta Çağ, Edo, Sahel, Ahşap Karkas, Taş Yapı, Kıyı Mimarisi ve Yayla Mimarisi. Stil; çatıları, duvarları ve bitki örtüsünü değiştirir.' },
92
+ { question: 'Çevre için farklı arazi seçenekleri var mıdır?', answer: 'Yerleşiminizi orman, ova, sahil, nehir kenarı veya dağlık alanlara yerleştirerek dünya haritanıza organik biçimde entegre edebilirsiniz.' },
93
+ { question: 'Han ve demirci gibi mekanlar nasıl konumlandırılır?', answer: 'Han, demirci ve pazar gibi yapılar ağırlıklı algoritmalarla merkeze veya yerleşimin dış kısımlarına mantıklı şekilde dağıtılır.' },
94
+ { question: 'Kendi özel isimli mekanlarımızı ekleyebilir miyiz?', answer: 'Evet, binaların üzerinde okunaklı tabelalar olarak görünen ve harita verisinde saklanan kendi özel isimli mekanlarınızı ekleyebilirsiniz.' },
95
+ { question: 'Harita manuel olarak düzenlenebilir mi?', answer: 'Kesinlikle. Herhangi bir hücredeki bağlam menüsü üzerinden bina, yol, su ve ağaçları doğrudan ekleyebilir veya silebilirsiniz.' },
96
+ { question: 'Düzenleme sırasında yol ve su hücreleri nasıl birleşir?', answer: 'Yol kavşakları ve komşu su hücreleri pürüzsüz formlar oluşturacak şekilde kesintisiz biçimde otomatik birleşir.' },
97
+ { question: 'Harita nasıl kaydedilir veya paylaşılır?', answer: 'Doğrudan bir paylaşım bağlantısı kopyalayabilir veya gelecekte tekrar yüklemek üzere tam JSON harita dosyasını kaydedebilirsiniz.' },
98
+ { question: 'Hangi dışa aktarım formatları desteklenmektedir?', answer: 'Sanal masaüstleri (VTT) için PNG, baskı ve vektörel grafikler için SVG, tüm düzenlenebilir verileri saklamak için JSON desteklenir.' },
99
+ ];
100
+
101
+ const howTo = [
102
+ { name: 'Üretim Tohumunu Seçin', text: 'Rastgele oluşturulan adı kullanın veya ilk düzeni oluşturmak için kendi sözcüğünüzü girin.' },
103
+ { name: 'Arazi ve Stili Belirleyin', text: 'Çevreyi ve mimariyi kampanyanızın atmosferine göre ayarlayın.' },
104
+ { name: 'Yerleşim Boyutunu Ayarlayın', text: 'Mezra, köy veya kasaba seçin ve gerekirse ev sayısını güncelleyin.' },
105
+ { name: 'Mekanları Ekleyin', text: 'Varsayılan binaları etkinleştirin veya kendi özel isimli mekanlarınızı ekleyin.' },
106
+ { name: 'Hücreleri Düzenleyin', text: 'Yollarda, binalarda veya suda doğrudan değişiklik yapmak için bağlam menüsünü kullanın.' },
107
+ { name: 'Dışa Aktarın ve Paylaşın', text: 'Bağlantıyı kopyalayın veya haritanızı PNG, SVG veya JSON formatında kaydedin.' },
108
+ ];
109
+
110
+ const faqSchema: WithContext<FAQPage> = { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
111
+ const appSchema: WithContext<SoftwareApplication> = { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: 'FRP Yerleşim ve Keşif Haritası Üreteci', operatingSystem: 'All', applicationCategory: 'GameApplication', description: 'Yeniden üretilebilir tohumlar ve hücresel düzenleme ile FRP yerleşim haritası üreteci.' };
112
+ const howToSchema: WithContext<HowTo> = { '@context': 'https://schema.org', '@type': 'HowTo', name: 'FRP Yerleşim Haritası Nasıl Oluşturulur', step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })) };
113
+
114
+ const schemas: WithContext<SoftwareApplication | FAQPage | HowTo>[] = [faqSchema, appSchema, howToSchema];
115
+
116
+ export const content: SettlementMapLocaleContent = {
117
+ slug: 'frp-yerlesim-ve-kesif-haritasi-ureteci',
118
+ title: 'FRP Yerleşim ve Keşif Haritası Üreteci',
119
+ description: 'Yeniden üretilebilir tohumlar, 7 stil ve doğrudan hücre düzenleme ile FRP oyunlarınız için haritalar tasarlayın.',
120
+ ui,
121
+ seo: [
122
+ { type: 'title', text: 'FRP Oyunlarınız İçin Canlı Yerleşimler Tasarlayın', level: 2 },
123
+ { type: 'paragraph', html: 'Masaüstü rol yapma oyunlarınız ve dünya oluşturma projeleriniz için planlı yol ağları, meydanlar ve önemli yapılar içeren eksiksiz köyler, mezralar ve kasabalar tasarlayın. Bu web tabanlı harita üreteci; konutların, yolların, pazar yerlerinin, su kütlelerinin ve yeşil alanların uyumlu, detaylı ve inandırıcı bir alanda birleştiği kuş bakışı haritalar oluşturur. Yol üstü hızlı bir konaklama noktası, oyuncuların başlangıç köyü, bir lonca karargahı veya rakip loncalar, sırlarla ve heyecan verici görevlerle dolu büyük bir ticaret merkezi için mükemmel bir araçtır. Üretilen her mekan doğal, canlı ve oyun oturumunuza tamamen hazır görünür.' },
124
+ { type: 'title', text: 'Yeniden Üretilebilir Tohum (Seed) Sistemi', level: 2 },
125
+ { type: 'paragraph', html: 'Oluşturulan her yerleşim, akılda kalıcı metin tabanlı bir tohuma (seed) dayanır. Aynı tohum ve ayarlar haritanın ilk halinin her defasında birebir aynı şekilde yeniden üretilmesini sağlar. Bu durum, ayrıntılı notlarını ilerleyen oturumlar için saklamak isteyen veya temel düzende hiçbir sapma olmadan haritayı başkalarıyla paylaşmak isteyen oyun yöneticileri için inanılmaz derecede pratiktir. Tohumu değiştirerek, hayal gücünüzle şekillenen dünyanızın üzerinde tam kontrol sahibi olmaya devam ederken yepyeni bir sokak ve bina düzenini anında keşfedebilirsiniz.' },
126
+ { type: 'list', items: ['Yeni tohum, seçilen boyut sınırları içinde benzersiz bir yol ve bina düzeni oluşturur.', 'Oyun yöneticisinin notları ve kampanya materyalleri için tam yeniden üretilebilirlik.', 'Şehir planlama mantığını ve mekansal oranları haritada korur.', 'Macera için sağlam bir başlangıç noktası olarak oyuncularla kolayca paylaşılır.'] },
127
+ { type: 'title', text: 'Mezradan Hareketli Kasabaya Kadar Ölçekleme', level: 2 },
128
+ { type: 'paragraph', html: 'Küçük yol üstü konaklama noktalarından, yerleşimin boyutuna uygun sokak modelleri ve değişken bina yoğunluğuna sahip büyük kasabalara kadar seçim yapın. Her boyut kategorisi kendi iç mimari mantığına ve konut sayısı aralığına sahip olup macera ve keşifleriniz için mükemmel bir sahne hazırlar.' },
129
+ { type: 'table', headers: ['Boyut', 'Konut Sayısı', 'Karakter', 'Kampanya Kullanımı'], rows: [['Mezra', '3-18', 'Küçük ve Sessiz', 'Yol üstü konaklama veya izole yerleşim'], ['Köy', '4-28', 'Yerel Merkez', 'Oyuncu üssü ve başlangıç mekanı'], ['Kasaba', '6-42', 'Yoğun ve Hareketli', 'Bölgesel ticaret merkezi ve soruşturma mekanı']] },
130
+ { type: 'title', text: 'Doğru Atmosfer İçin Yedi Mimari Stil', level: 2 },
131
+ { type: 'paragraph', html: 'Her yerleşime özgün bir görsel kimlik ve atmosfer kazandırın. Orta Çağ, Edo, Sahel, Ahşap Karkas, Taş Yapı, Kıyı Mimarisi ve Yayla Mimarisi stilleri; fantastik dünyanızın coğrafyasını ve kültürünü yansıtmak amacıyla çatıları, duvar malzemelerini, renk tonlarını ve çevredeki bitki örtüsünü değiştirir. Her mimari detay mekan duygusunu pekiştirir.' },
132
+ { type: 'list', items: ['Klasik fantezi ve orman köyleri için Orta Çağ ve Ahşap Karkas.', 'Sarp dağ bölgeleri, kaleler ve karakollar için Taş Yapı ve Yayla Mimarisi.', 'Ahşap iskeleler ve kıyı florası içeren liman kasabaları için Kıyı Mimarisi.', 'Doğu temalı dünyalar, ahşap yapılar ve özel çatılar için Edo Dönemi.', 'Sıcak bölgeler, kerpiç binalar ve çöl vahaları için Sahel Stili.'] },
133
+ { type: 'title', text: 'Mekanların ve Tabelaların Akıllı Yerleşimi', level: 2 },
134
+ { type: 'paragraph', html: 'Hanlar, demirciler, tapınaklar ve belediye binaları ağırlıklı algoritmalar kullanılarak merkez ile dış kısımlar arasında mimari mantığa uygun olarak dağıtılır. Eklediğiniz özel mekanlar binaların üzerinde net ve okunaklı tabelalar olarak görünür; bu da oyun esnasında oryantasyonu kolaylaştırır ve oyuncuların ortama uyumunu artırır.' },
135
+ { type: 'title', text: 'Dünya Arazisi İle Doğal Entegrasyon', level: 2 },
136
+ { type: 'paragraph', html: 'Dünya haritanızdaki çevresel alanlarla doğal bir bütünlük oluşturmak için yerleşimlerinizi orman, ova, sahil, nehir kenarı veya dağlık bölgelere yerleştirin. Bitki örtüsü ve su kanalları seçilen doğal bölgeye göre otomatik olarak uyarlanır.' },
137
+ { type: 'title', text: 'Tarayıcıda Doğrudan Hücre Düzenleme', level: 2 },
138
+ { type: 'paragraph', html: 'Masaüstünde sağ tıklayarak veya mobil cihazlarda uzun basarak ev, yol, su ve ağaçları kolayca ekleyin veya silin. Haritayı senaryonuzun özel ihtiyaçlarına göre uyarlayın ve harici görsel düzenleme programlarına ihtiyaç duymadan kilit noktaları anında haritaya işleyin.' },
139
+ { type: 'list', items: ['Önemli mekanlar, gözetleme kuleleri veya çitler ekleyin.', 'Harici grafik programlarına gerek kalmadan hızlı düzenleme.', 'Tüm manuel değişiklikleri doğrudan harita verisinde saklayın.', 'Bilgisayarda, tablette ve mobilde pürüzsüz çalışma performansı.'] },
140
+ { type: 'title', text: 'Dinamik Yollar ve Su Bağlantıları', level: 2 },
141
+ { type: 'paragraph', html: 'Sokak kavşakları ve komşu su hücreleri pürüzsüz, estetik ve doğal biçimler oluşturacak şekilde otomatik olarak birleşir; bu da yerleşiminiz için temiz ve profesyonel bir harita görünümü sunar.' },
142
+ { type: 'title', text: 'Gelecek Oturumlar İçin Kaydetme ve Paylaşma', level: 2 },
143
+ { type: 'paragraph', html: 'Düzenleme yapmak için doğrudan bir paylaşım bağlantısını kolayca kopyalayın veya tam yerleşim verilerini bir JSON dosyası olarak kaydedin; böylece önemli ayrıntıları kaybetmeden sonraki oyun oturumlarınızda haritanız üzerinde çalışmaya devam edebilirsiniz.' },
144
+ { type: 'title', text: 'Her İhtiyaca Uygun Dışa Aktarım Formatları', level: 2 },
145
+ { type: 'table', headers: ['Format', 'Kullanım Amacı', 'İçerik'], rows: [['PNG', 'Sanal masaüstleri (VTT) ve notlar', 'Yüksek çözünürlüklü görsel'], ['SVG', 'Baskı ve vektörel grafikler', 'Kalite kaybı olmayan net vektör'], ['JSON', 'İlerleyen düzenlemeler', 'Tüm harita hücrelerinin eksiksiz verisi']] },
146
+ { type: 'tip', title: 'Oyun Yöneticisi İçin Hazırlık İpucu', html: 'Tohum, boyut ve araziyi seçin, kilit mekanları ekleyin ve oyun oturumu başlamadan önce harita üzerindeki son rötuşları tamamlayın.' },
147
+ ],
148
+ faq,
149
+ bibliography,
150
+ howTo,
151
+ schemas,
152
+ };
@@ -0,0 +1,152 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
3
+ import type { SettlementMapLocaleContent, SettlementMapUI } from '../entry';
4
+
5
+ const ui: SettlementMapUI = {
6
+ intro: '生成并编辑用于跑团探索的跑团聚落地图。选择地形、规模、建筑风格,并通过右键上下文菜单编辑网格。',
7
+ seedLabel: '生成种子与聚落名称',
8
+ seedHint: '决定随机但可复现的街道与建筑物布局 pattern。',
9
+ randomSeed: '随机生成新名称',
10
+ environmentLabel: '周边地形环境',
11
+ forest: '森林',
12
+ plains: '平原',
13
+ coast: '海岸',
14
+ river: '河流',
15
+ mountain: '山脉',
16
+ styleLabel: '建筑与视觉风格',
17
+ styleHint: '改变聚落屋顶、墙体、建筑材料以及植物外观。',
18
+ styleTimber: '半木构',
19
+ styleStone: '石砌',
20
+ styleCoastal: '沿海',
21
+ styleHighland: '高地',
22
+ styleMedieval: '中世纪',
23
+ styleEdo: '江户风格',
24
+ styleSahelian: '萨赫勒风格',
25
+ sizeLabel: '聚落规模大小',
26
+ hamlet: '村庄仔',
27
+ hamletHint: '小型歇脚点',
28
+ village: '村庄',
29
+ villageHint: '区域中心',
30
+ town: '城镇',
31
+ townHint: '繁华枢纽',
32
+ homesLabel: '民居住宅数量',
33
+ homesHint: '调节所选规模级别内的住宅建筑总数量。',
34
+ servicesLabel: '设施与地标建筑',
35
+ serviceListHint: '选择基础功能建筑或添加自定义命名地标。',
36
+ newServicePlaceholder: '输入地标或设施名称',
37
+ addService: '添加',
38
+ removeService: '移除',
39
+ serviceTavern: '酒馆',
40
+ serviceSmithy: '铁匠铺',
41
+ serviceTemple: '神庙',
42
+ serviceMarket: '集市',
43
+ serviceStable: '马厩',
44
+ serviceHall: '市政厅',
45
+ generate: '重新生成地图',
46
+ mapRegionLabel: '可编辑的跑团聚落探索地图',
47
+ mapSummary: '聚落平面图',
48
+ buildings: '建筑',
49
+ paths: '道路',
50
+ services: '设施',
51
+ terrain: '水域',
52
+ legendLabel: '地图图例',
53
+ legendHome: '住宅',
54
+ legendService: '设施',
55
+ legendPath: '道路',
56
+ legendWater: '水域',
57
+ legendWild: '森林',
58
+ editLabel: '网格直接编辑',
59
+ toolSelect: '查看',
60
+ toolBuilding: '建筑',
61
+ toolPath: '道路',
62
+ toolWater: '水域',
63
+ toolTree: '树木',
64
+ toolErase: '擦除',
65
+ serviceSelectLabel: '新设施标签',
66
+ clickHint: '右键点击或长按网格以打开操作菜单。',
67
+ selectedHint: '已选网格:',
68
+ shareLink: '复制链接',
69
+ linkCopied: '链接已复制到剪贴板',
70
+ exportPng: 'PNG',
71
+ exportSvg: 'SVG',
72
+ exportJson: '保存 JSON',
73
+ importJson: '打开 JSON',
74
+ importError: '无效的聚落地图文件。',
75
+ mapData: '地图数据',
76
+ readyBadge: '准备探索',
77
+ serviceNone: '无标签',
78
+ contextMenuLabel: '网格菜单',
79
+ contextInspect: '查看网格',
80
+ contextBuilding: '添加建筑',
81
+ contextPath: '添加道路',
82
+ contextWater: '添加水域',
83
+ contextTree: '添加树木',
84
+ contextErase: '擦除网格',
85
+ };
86
+
87
+ const faq = [
88
+ { question: '这款跑团聚落探索地图生成器可以创建什么内容?', answer: '您可以为跑团游戏和世界观构建生成详细且直观的村庄、小镇和城市平面图。建筑、道路、水域和植被会根据逻辑规则自动布署。' },
89
+ { question: '更改生成种子(seed)会改变地图布局吗?', answer: '是的。相同的种子和参数设置每次都会生成完全相同的初始地图。这使得在笔记中保存地图并与玩家共享变得非常简单。' },
90
+ { question: '提供哪些聚落规模选项?', answer: '您可以选择村庄仔、村庄和城镇三种规模。建筑密度、道路网络和基础设施规模会自动按比例缩放。' },
91
+ { question: '可以自定义建筑风格吗?', answer: '可以,提供 7 种风格:中世纪、江户风格、萨赫勒风格、半木构、石砌、沿海和高地。风格会改变屋顶、墙壁材质和植被外观。' },
92
+ { question: '周边环境是否有不同地形选择?', answer: '您可以将聚落布置在森林、平原、海岸、河畔或山脉中,以便有机地融入您的世界地图。' },
93
+ { question: '像酒馆这样的设施 meihan 是如何布局的?', answer: '酒馆、铁匠铺和集市等建筑会根据权重算法合理分布在聚落中心或边缘区域。' },
94
+ { question: '可以添加自定义的独特地标吗?', answer: '可以,您可以添加自定义命名的地点,这些地点会作为清晰的标牌显示在建筑物上方并保存在地图数据中。' },
95
+ { question: '可以手动编辑地图吗?', answer: '当然可以。通过任意网格上的右键菜单,您可以直接添加或删除建筑、道路、水域和树木。' },
96
+ { question: '编辑时道路和水域如何连接?', answer: '道路交叉口和相邻的水域网格会自动融合成平滑自然的外形,没有杂乱边缘。' },
97
+ { question: '如何保存或分享生成的地图?', answer: '您可以复制直接分享链接,也可以保存完整的 JSON 文件以便日后重新加载与编辑。' },
98
+ { question: '支持哪些导出格式?', answer: '支持用于 VTT 虚拟桌面的 PNG,用于打印和矢量图的 SVG,以及用于保存所有编辑数据的 JSON。' },
99
+ ];
100
+
101
+ const howTo = [
102
+ { name: '选择生成种子', text: '使用随机生成的名称或输入您自己的词汇来创建初始布局 pattern。' },
103
+ { name: '选择地形与风格', text: '根据战役氛围调整周边环境和建筑视觉 style。' },
104
+ { name: '设置聚落规模', text: '选择村庄仔、村庄或城镇,并根据需要微调住宅数量。' },
105
+ { name: '添加设施地标', text: '启用默认功能建筑或添加自定义命名地标。' },
106
+ { name: '编辑网格细节', text: '使用右键菜单对道路、建筑或水域进行直接修改。' },
107
+ { name: '导出与共享', text: '复制链接或将地图保存为 PNG、SVG 或 JSON 格式。' },
108
+ ];
109
+
110
+ const faqSchema: WithContext<FAQPage> = { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
111
+ const appSchema: WithContext<SoftwareApplication> = { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: '跑团聚落与探索地图生成器', operatingSystem: 'All', applicationCategory: 'GameApplication', description: '支持可复现种子与网格直接编辑的跑团聚落探索地图生成器。' };
112
+ const howToSchema: WithContext<HowTo> = { '@context': 'https://schema.org', '@type': 'HowTo', name: '如何生成跑团聚落探索地图', step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })) };
113
+
114
+ const schemas: WithContext<SoftwareApplication | FAQPage | HowTo>[] = [faqSchema, appSchema, howToSchema];
115
+
116
+ export const content: SettlementMapLocaleContent = {
117
+ slug: 'rpg-settlement-exploration-map-generator',
118
+ title: '跑团聚落与探索地图生成器',
119
+ description: '使用可复现种子、7 种视觉风格与网格直接编辑功能,为跑团游戏设计村庄和城镇地图。',
120
+ ui,
121
+ seo: [
122
+ { type: 'title', text: '为桌面角色扮演游戏设计生动的聚落地图探索系统', level: 2 },
123
+ { type: 'paragraph', html: '为您的桌面角色扮演游戏(TRPG / 跑团)和奇幻世界观架空构建设计包含规划合理的道路网络、中央广场、防御工事和核心设施建筑的完整村庄、聚落、村落与小镇。这款基于浏览器构建的地图生成器可以生成清晰直观的俯视视角平面地图,民居住宅、主要道路、集市广场、水系运河与绿化景观有机融为一体,构成一个充满丰富细节且富有高度说服力的探险空间。无论是作为冒险者旅途中的临时歇脚点、玩家角色的起始村庄总部、公会大本营,还是充斥着敌对派系势力、隐藏秘密与精彩剧情任务的繁华贸易枢纽,它都是极为理想且高效的辅助设计工具。每个生成的地点都显得生动自然、层次分明,随时可以投入到一场引人入胜的游戏会话探险中。' },
124
+ { type: 'title', text: '可复现的生成种子(Seed)系统', level: 2 },
125
+ { type: 'paragraph', html: '每个生成的聚落都基于一个易于记忆和记录的文本种子(Seed)。完全相同的种子和参数设置能够保证每次都精准无误地重现最初的地图布局。这对于希望将详细地图笔记保存下来以备后续游戏会话使用、或者希望与其他地下城主(DM / GM)共享地图而不用担心基础布局产生任何微小偏差的城主来说,是非常实用且不可或缺的功能。通过更换种子,您可以立即探索全新的、独一无二的街道与建筑布局 pattern,同时在创造奇幻世界的过程中保持完全的掌控力与创作自由。' },
126
+ { type: 'list', items: ['新种子可在选定的规模范围内生成独特的道路与建筑布局 pattern。', '为城主笔记和战役资料提供完全的可复现性与一致性体验。', '在地图中保持合理的城市规划逻辑与空间比例关系。', '便于与玩家分享,作为探索冒险的稳定起点与地图参照。'] },
127
+ { type: 'title', text: '从微型村庄到繁华城镇的规模动态缩放', level: 2 },
128
+ { type: 'paragraph', html: '从路边的小型村落歇脚点,到匹配聚落规模且具有多变建筑密度与道路形态的大型城镇,您可以自由选择。每个规模级别都有其内部建筑逻辑与住宅数量范围,为冒险与探险活动搭建完美的舞台,让每一次探索都充满未知的惊喜与故事发展的可能性。' },
129
+ { type: 'table', headers: ['规模等级', '住宅数量', '区域特征', '战役应用场景'], rows: [['村庄仔', '3-18', '小巧安静', '路边歇脚点或偏远孤立聚落'], ['村庄', '4-28', '区域中心', '玩家基地与起始探险地点'], ['城镇', '6-42', '密集繁华', '区域贸易枢纽与调查任务地点']] },
130
+ { type: 'title', text: '七种视觉建筑风格营造丰富奇幻氛围', level: 2 },
131
+ { type: 'paragraph', html: '赋予每个聚落独一无二的视觉标识与文化氛围。中世纪、江户风格、萨赫勒风格、半木构、石砌、沿海和高地风格会改变屋顶造型、墙体材料、色彩点缀以及周边植被外观,精准反映奇幻世界中特定区域的地理环境与文化特色。每处细节都能极大增强场景的代入感与艺术美感。' },
132
+ { type: 'list', items: ['中世纪与半木构风格适合经典奇幻与森林村庄环境。', '石砌与高地风格适合险峻山區、城堡与前线哨所基地。', '沿海风格适合带有木质码头与海岸植物的港口城镇。', '江户风格适合东方奇幻设定、木质结构与特色屋顶外观。', '萨赫勒风格适合炎热地区、泥砖建筑与沙漠绿洲聚落。'] },
133
+ { type: 'title', text: '设施与地标标牌的智能算法布局', level: 2 },
134
+ { type: 'paragraph', html: '酒馆、铁匠铺、神庙和市政厅等功能建筑会利用权重算法,在聚落中心与边缘区域之间按照建筑逻辑合理分布。您添加的自定义地点会作为清晰易读的标牌直接悬浮在建筑物上方,极大方便了游戏过程中的方位辨识,增强了玩家的沉浸体验与方向感。' },
135
+ { type: 'title', text: '与战役世界地形环境的自然融合', level: 2 },
136
+ { type: 'paragraph', html: '将聚落放置在森林、平原、海岸、河畔或山脉中,使其自然地融入您世界地图的周边野外环境中。植被和水流形态会根据所选的自然环境自动调整,展现出无缝衔接的地形地貌特色。' },
137
+ { type: 'title', text: '在浏览器中直接进行便捷的网格编辑', level: 2 },
138
+ { type: 'paragraph', html: '在电脑端通过右键点击,或在移动设备上通过长按,轻松添加或删除住宅、道路、水域和树木。根据战役剧本的特定需求随时调整地图,无需借助外部图像编辑软件或复杂的绘图工具即可在现场补充关键要素与防卫设施。' },
139
+ { type: 'list', items: ['添加关键地点、瞭望塔或防御木栅栏等战术要素。', '无需外部绘图软件即可实现快速现场修改与实时预览。', '将所有手动修改直接保存在地图数据与导出的文件里。', '在电脑、平板和手机端均可流畅运行与便捷操作。'] },
140
+ { type: 'title', text: '动态道路与水域自动平滑连接技术', level: 2 },
141
+ { type: 'paragraph', html: '街道交叉口和相邻的水域网格会自动融合成平滑、美观且自然的形态,消除生硬边缘,为您的聚落呈现出干净专业的高质量地图视图,提升画面的精致度。' },
142
+ { type: 'title', text: '保存与共享以便后续会话长期使用', level: 2 },
143
+ { type: 'paragraph', html: '轻松复制直接编辑链接,或将完整的地图保存为 JSON 文件,以便在接下来的游戏会话中继续完善您的聚落,绝不会丢失任何关键细节与个性化调整。' },
144
+ { type: 'title', text: '满足各种跑团需求的导出格式支持', level: 2 },
145
+ { type: 'table', headers: ['导出格式', '主要用途', '包含内容'], rows: [['PNG', 'VTT 虚拟桌面与游戏笔记', '高清图像文件'], ['SVG', '打印与矢量图形编辑', '无损清晰矢量图'], ['JSON', '后续二次编辑', '包含所有网格的完整地图数据']] },
146
+ { type: 'tip', title: '地下城主准备建议', html: '在游戏会话开始前,设定好种子、规模与地形,添加核心设施地标,并在地图上完成最后的细节微调与战术部署。' },
147
+ ],
148
+ faq,
149
+ bibliography,
150
+ howTo,
151
+ schemas,
152
+ };
@@ -0,0 +1,4 @@
1
+ import type { ToolDefinition } from '../../types';
2
+ import { rpgSettlementExplorationMapGenerator } from './entry';
3
+ export * from './entry';
4
+ export const RPG_SETTLEMENT_EXPLORATION_MAP_GENERATOR_TOOL: ToolDefinition = { entry: rpgSettlementExplorationMapGenerator, Component: () => import('./component.astro'), SEOComponent: () => import('./seo.astro'), BibliographyComponent: () => import('./bibliography.astro') };
@@ -0,0 +1,65 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { addBuilding, addPath, addWater, DEFAULT_CONFIG, eraseAt, generateSettlement, homeRange, normalizeConfig, settlementPreset } from './logic';
3
+
4
+ describe('settlement map logic', () => {
5
+ it('rebuilds the same map from the same setup', () => {
6
+ expect(generateSettlement(DEFAULT_CONFIG)).toEqual(generateSettlement(DEFAULT_CONFIG));
7
+ });
8
+
9
+ it('normalizes size dependent home ranges and invalid values', () => {
10
+ const config = normalizeConfig({ size: 'hamlet', homes: 100, environment: 'unknown' as never, services: ['tavern', 'tavern', 'invalid' as never] });
11
+ expect(config.homes).toBe(18);
12
+ expect(config.environment).toBe('forest');
13
+ expect(config.services).toEqual(['tavern', 'invalid']);
14
+ });
15
+
16
+ it('supports direct map edits', () => {
17
+ const map = generateSettlement({ ...DEFAULT_CONFIG, homes: 10 });
18
+ const withBuilding = addBuilding(map, { x: 1, y: 1 }, 'market');
19
+ const withPath = addPath(withBuilding, { x: 4, y: 4 });
20
+ const withWater = addWater(withPath, { x: 8, y: 8 });
21
+ const erased = eraseAt(withWater, { x: 8, y: 8 });
22
+ expect(withBuilding.buildings.length).toBeGreaterThanOrEqual(map.buildings.length);
23
+ expect(withPath.paths.length).toBeGreaterThan(withBuilding.paths.length - 1);
24
+ expect(erased.water).not.toContainEqual({ x: 8, y: 8 });
25
+ });
26
+
27
+ it('supports small settlements and connects every home to the plaza', () => {
28
+ const map = generateSettlement({ ...DEFAULT_CONFIG, size: 'hamlet', homes: 3 });
29
+ expect(homeRange('hamlet').min).toBe(3);
30
+ expect(map.buildings).toHaveLength(3);
31
+ expect(map.paths).toHaveLength(map.buildings.length);
32
+ map.paths.forEach((path) => expect(path.points.at(-1)).toEqual({ x: map.plaza.x + 3, y: map.plaza.y + 2 }));
33
+ });
34
+
35
+ it('changes the urban preset when the footprint changes', () => {
36
+ expect(settlementPreset('hamlet')).toEqual({ homes: 6, services: ['tavern', 'stable'] });
37
+ expect(settlementPreset('town').homes).toBeGreaterThan(settlementPreset('village').homes);
38
+ });
39
+
40
+ it('uses the seed to choose a varied pattern within each settlement type', () => {
41
+ const first = generateSettlement({ ...DEFAULT_CONFIG, size: 'town', seed: 'Oak Mere' });
42
+ const second = generateSettlement({ ...DEFAULT_CONFIG, size: 'town', seed: 'Red Cairn' });
43
+ expect(first.buildings.map(({ x, y }) => `${x},${y}`)).not.toEqual(second.buildings.map(({ x, y }) => `${x},${y}`));
44
+ });
45
+
46
+ it('stores the visual settlement character in the generated map', () => {
47
+ const map = generateSettlement({ ...DEFAULT_CONFIG, style: 'stone' });
48
+ expect(map.config.style).toBe('stone');
49
+ });
50
+
51
+ it('turns a painted water cell into part of the terrain', () => {
52
+ const map = generateSettlement({ ...DEFAULT_CONFIG, homes: 3, size: 'hamlet' });
53
+ const target = map.buildings[0]!;
54
+ const painted = addWater(map, { x: target.x, y: target.y });
55
+ expect(painted.water).toContainEqual({ x: target.x, y: target.y });
56
+ expect(painted.buildings).not.toContainEqual(target);
57
+ });
58
+
59
+ it('keeps roads finite when a river crosses the whole map', () => {
60
+ const map = generateSettlement({ ...DEFAULT_CONFIG, environment: 'river', size: 'town', homes: 24 });
61
+ expect(map.water.length).toBeGreaterThan(0);
62
+ expect(map.paths).toHaveLength(map.buildings.length);
63
+ expect(Math.max(...map.paths.map((path) => path.points.length))).toBeLessThan(map.width + map.height);
64
+ });
65
+ });