@jjlmoya/utils-creative 1.6.0 → 1.8.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 (117) hide show
  1. package/package.json +63 -62
  2. package/src/category/i18n/de.ts +9 -0
  3. package/src/category/i18n/id.ts +9 -0
  4. package/src/category/i18n/it.ts +9 -0
  5. package/src/category/i18n/ja.ts +9 -0
  6. package/src/category/i18n/ko.ts +9 -0
  7. package/src/category/i18n/nl.ts +9 -0
  8. package/src/category/i18n/pl.ts +9 -0
  9. package/src/category/i18n/pt.ts +9 -0
  10. package/src/category/i18n/ru.ts +9 -0
  11. package/src/category/i18n/sv.ts +9 -0
  12. package/src/category/i18n/tr.ts +9 -0
  13. package/src/category/i18n/zh.ts +9 -0
  14. package/src/category/index.ts +12 -0
  15. package/src/tests/faq_count.test.ts +1 -1
  16. package/src/tests/i18n_coverage.test.ts +36 -0
  17. package/src/tests/locale_completeness.test.ts +2 -2
  18. package/src/tests/schemas_fulfillment.test.ts +23 -0
  19. package/src/tests/title_quality.test.ts +55 -0
  20. package/src/tests/tool_validation.test.ts +2 -2
  21. package/src/tool/bead-pattern-generator/i18n/de.ts +115 -0
  22. package/src/tool/bead-pattern-generator/i18n/en.ts +59 -17
  23. package/src/tool/bead-pattern-generator/i18n/es.ts +59 -17
  24. package/src/tool/bead-pattern-generator/i18n/fr.ts +59 -17
  25. package/src/tool/bead-pattern-generator/i18n/id.ts +115 -0
  26. package/src/tool/bead-pattern-generator/i18n/it.ts +115 -0
  27. package/src/tool/bead-pattern-generator/i18n/ja.ts +115 -0
  28. package/src/tool/bead-pattern-generator/i18n/ko.ts +115 -0
  29. package/src/tool/bead-pattern-generator/i18n/nl.ts +115 -0
  30. package/src/tool/bead-pattern-generator/i18n/pl.ts +115 -0
  31. package/src/tool/bead-pattern-generator/i18n/pt.ts +115 -0
  32. package/src/tool/bead-pattern-generator/i18n/ru.ts +115 -0
  33. package/src/tool/bead-pattern-generator/i18n/sv.ts +115 -0
  34. package/src/tool/bead-pattern-generator/i18n/tr.ts +115 -0
  35. package/src/tool/bead-pattern-generator/i18n/zh.ts +115 -0
  36. package/src/tool/bead-pattern-generator/index.ts +12 -0
  37. package/src/tool/dice-roller/i18n/de.ts +138 -0
  38. package/src/tool/dice-roller/i18n/en.ts +74 -32
  39. package/src/tool/dice-roller/i18n/es.ts +74 -32
  40. package/src/tool/dice-roller/i18n/fr.ts +74 -32
  41. package/src/tool/dice-roller/i18n/id.ts +138 -0
  42. package/src/tool/dice-roller/i18n/it.ts +138 -0
  43. package/src/tool/dice-roller/i18n/ja.ts +138 -0
  44. package/src/tool/dice-roller/i18n/ko.ts +138 -0
  45. package/src/tool/dice-roller/i18n/nl.ts +138 -0
  46. package/src/tool/dice-roller/i18n/pl.ts +138 -0
  47. package/src/tool/dice-roller/i18n/pt.ts +138 -0
  48. package/src/tool/dice-roller/i18n/ru.ts +138 -0
  49. package/src/tool/dice-roller/i18n/sv.ts +138 -0
  50. package/src/tool/dice-roller/i18n/tr.ts +138 -0
  51. package/src/tool/dice-roller/i18n/zh.ts +138 -0
  52. package/src/tool/dice-roller/index.ts +12 -0
  53. package/src/tool/excuse-generator/i18n/de.ts +122 -0
  54. package/src/tool/excuse-generator/i18n/en.ts +60 -18
  55. package/src/tool/excuse-generator/i18n/es.ts +60 -18
  56. package/src/tool/excuse-generator/i18n/fr.ts +60 -18
  57. package/src/tool/excuse-generator/i18n/id.ts +122 -0
  58. package/src/tool/excuse-generator/i18n/it.ts +122 -0
  59. package/src/tool/excuse-generator/i18n/ja.ts +122 -0
  60. package/src/tool/excuse-generator/i18n/ko.ts +122 -0
  61. package/src/tool/excuse-generator/i18n/nl.ts +122 -0
  62. package/src/tool/excuse-generator/i18n/pl.ts +122 -0
  63. package/src/tool/excuse-generator/i18n/pt.ts +122 -0
  64. package/src/tool/excuse-generator/i18n/ru.ts +122 -0
  65. package/src/tool/excuse-generator/i18n/sv.ts +122 -0
  66. package/src/tool/excuse-generator/i18n/tr.ts +122 -0
  67. package/src/tool/excuse-generator/i18n/zh.ts +122 -0
  68. package/src/tool/excuse-generator/index.ts +12 -0
  69. package/src/tool/fortune-cookie/i18n/de.ts +127 -0
  70. package/src/tool/fortune-cookie/i18n/en.ts +60 -18
  71. package/src/tool/fortune-cookie/i18n/es.ts +60 -18
  72. package/src/tool/fortune-cookie/i18n/fr.ts +60 -18
  73. package/src/tool/fortune-cookie/i18n/id.ts +127 -0
  74. package/src/tool/fortune-cookie/i18n/it.ts +127 -0
  75. package/src/tool/fortune-cookie/i18n/ja.ts +127 -0
  76. package/src/tool/fortune-cookie/i18n/ko.ts +127 -0
  77. package/src/tool/fortune-cookie/i18n/nl.ts +127 -0
  78. package/src/tool/fortune-cookie/i18n/pl.ts +127 -0
  79. package/src/tool/fortune-cookie/i18n/pt.ts +127 -0
  80. package/src/tool/fortune-cookie/i18n/ru.ts +127 -0
  81. package/src/tool/fortune-cookie/i18n/sv.ts +127 -0
  82. package/src/tool/fortune-cookie/i18n/tr.ts +127 -0
  83. package/src/tool/fortune-cookie/i18n/zh.ts +127 -0
  84. package/src/tool/fortune-cookie/index.ts +12 -0
  85. package/src/tool/synesthesia-painter/i18n/de.ts +122 -0
  86. package/src/tool/synesthesia-painter/i18n/en.ts +74 -32
  87. package/src/tool/synesthesia-painter/i18n/es.ts +74 -32
  88. package/src/tool/synesthesia-painter/i18n/fr.ts +75 -33
  89. package/src/tool/synesthesia-painter/i18n/id.ts +122 -0
  90. package/src/tool/synesthesia-painter/i18n/it.ts +122 -0
  91. package/src/tool/synesthesia-painter/i18n/ja.ts +122 -0
  92. package/src/tool/synesthesia-painter/i18n/ko.ts +122 -0
  93. package/src/tool/synesthesia-painter/i18n/nl.ts +122 -0
  94. package/src/tool/synesthesia-painter/i18n/pl.ts +122 -0
  95. package/src/tool/synesthesia-painter/i18n/pt.ts +122 -0
  96. package/src/tool/synesthesia-painter/i18n/ru.ts +122 -0
  97. package/src/tool/synesthesia-painter/i18n/sv.ts +122 -0
  98. package/src/tool/synesthesia-painter/i18n/tr.ts +122 -0
  99. package/src/tool/synesthesia-painter/i18n/zh.ts +122 -0
  100. package/src/tool/synesthesia-painter/index.ts +12 -0
  101. package/src/tool/zalgo-generator/i18n/de.ts +113 -0
  102. package/src/tool/zalgo-generator/i18n/en.ts +58 -16
  103. package/src/tool/zalgo-generator/i18n/es.ts +58 -16
  104. package/src/tool/zalgo-generator/i18n/fr.ts +58 -16
  105. package/src/tool/zalgo-generator/i18n/id.ts +113 -0
  106. package/src/tool/zalgo-generator/i18n/it.ts +113 -0
  107. package/src/tool/zalgo-generator/i18n/ja.ts +113 -0
  108. package/src/tool/zalgo-generator/i18n/ko.ts +113 -0
  109. package/src/tool/zalgo-generator/i18n/nl.ts +113 -0
  110. package/src/tool/zalgo-generator/i18n/pl.ts +113 -0
  111. package/src/tool/zalgo-generator/i18n/pt.ts +113 -0
  112. package/src/tool/zalgo-generator/i18n/ru.ts +113 -0
  113. package/src/tool/zalgo-generator/i18n/sv.ts +113 -0
  114. package/src/tool/zalgo-generator/i18n/tr.ts +113 -0
  115. package/src/tool/zalgo-generator/i18n/zh.ts +113 -0
  116. package/src/tool/zalgo-generator/index.ts +12 -0
  117. package/src/tools.ts +14 -1
@@ -0,0 +1,138 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { DiceRollerLocaleContent } from '../index';
3
+
4
+ const slug = 'dobbelsteen-roller';
5
+ const title = 'Dobbelsteen Roller';
6
+ const description = 'Een complete dobbelsteensimulator voor je RPG- en bordspellen. Rol d4, d6, d8, d10, d12, d20 en d100 met modifiers en geschiedenis.';
7
+
8
+ const faq: DiceRollerLocaleContent['faq'] = [
9
+ {
10
+ question: 'Hoe kan ik een worp met voordeel (advantage) simuleren (D&D)?',
11
+ answer: 'Voeg twee d20 dobbelstenen toe aan de zak door twee keer op de d20-knop te klikken. Let bij het rollen op de twee individuele resultaten en houd de hoogste aan. De getoonde totaalwaarde is de som, maar je kunt elke dobbelsteen afzonderlijk zien in de uitsplitsing van het resultaat.',
12
+ },
13
+ {
14
+ question: 'Wat betekent de groene of rode kleur bij de resultaten?',
15
+ answer: 'Groene resultaten geven aan dat de dobbelsteen de maximaal mogelijke waarde heeft gerold (een "critical"). Rode resultaten geven de minimumwaarde aan (een "1", het slechtst mogelijke resultaat). Dit maakt het gemakkelijk om crits en fumbles in één oogopslag te herkennen.',
16
+ },
17
+ {
18
+ question: 'Kan ik meerdere dobbelstenen van hetzelfde type toevoegen?',
19
+ answer: 'Ja. Elke klik op een dobbelsteen voegt deze toe aan de zak. Als je drie keer op d6 klikt, zie je "3d6" in de zak. Om het aantal te verminderen, klik je op de "−" knop die naast elke dobbelsteengroep in de zak verschijnt.',
20
+ },
21
+ {
22
+ question: 'Zijn digitale dobbelstenen net zo willekeurig als fysieke?',
23
+ answer: 'Statistisch gezien, ja. Moderne JavaScript-engines gebruiken pseudorandom algoritmen (xorshift128+) met een zeer hoogwaardige uniforme verdeling. Een echte fysieke dobbelsteen kan kleine fabricagefoutjes hebben die de resultaten beïnvloeden; de digitale dobbelsteen heeft dat probleem niet.',
24
+ },
25
+ {
26
+ question: 'Wat is de d100 en hoe wordt deze gebruikt?',
27
+ answer: 'De d100 (of d%) genereert een getal van 1 tot 100 en wordt gebruikt in percentage-gebaseerde spelsystemen, zoals Call of Cthulhu of Warhammer Fantasy Roleplay. Het vertegenwoordigt "directe waarschijnlijkheid": als je Stealthvaardigheid 65% is, moet je 65 of lager rollen om te slagen.',
28
+ },
29
+ ];
30
+
31
+ const howTo: DiceRollerLocaleContent['howTo'] = [
32
+ { name: 'Bouw de dobbelsteenpool op', text: 'Klik op de dobbelsteenknoppen (d4, d6, d8...) om ze aan je pool toe te voegen. Elke klik voegt één dobbelsteen van het geselecteerde type toe. Je kunt verschillende types in dezelfde worp mengen.' },
33
+ { name: 'Pas de modifier aan', text: 'Gebruik de "+" en "−" knoppen naast de modifier om bonussen of straffen toe te passen (zoals de ability modifier in D&D). De modifier wordt automatisch bij het totaal opgeteld.' },
34
+ { name: 'Rol de dobbelstenen', text: 'Druk op de knop "Gooi Dobbelstenen". Het rechterpaneel toont het uiteindelijke totaal en de uitsplitsing van elke individuele dobbelsteen, met crits (maximum) in het groen en fumbles (minimum) in het rood.' },
35
+ { name: 'Bekijk de geschiedenis', text: 'Elke worp wordt in de geschiedenis opgenomen met de gebruikte dobbelsteennotatie, het totaalresultaat en de exacte tijd. Je kunt de geschiedenis wissen met de bijbehorende knop.' },
36
+ ];
37
+
38
+ const faqSchema: WithContext<FAQPage> = {
39
+ '@context': 'https://schema.org',
40
+ '@type': 'FAQPage',
41
+ mainEntity: faq.map((item) => ({
42
+ '@type': 'Question',
43
+ name: item.question,
44
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
45
+ })),
46
+ };
47
+
48
+ const howToSchema: WithContext<HowTo> = {
49
+ '@context': 'https://schema.org',
50
+ '@type': 'HowTo',
51
+ name: title,
52
+ description,
53
+ step: howTo.map((step) => ({
54
+ '@type': 'HowToStep',
55
+ name: step.name,
56
+ text: step.text,
57
+ })),
58
+ };
59
+
60
+ const appSchema: WithContext<SoftwareApplication> = {
61
+ '@context': 'https://schema.org',
62
+ '@type': 'SoftwareApplication',
63
+ name: title,
64
+ description,
65
+ applicationCategory: 'UtilitiesApplication',
66
+ operatingSystem: 'Web',
67
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
68
+ inLanguage: 'nl',
69
+ };
70
+
71
+ export const content: DiceRollerLocaleContent = {
72
+ slug,
73
+ title,
74
+ description,
75
+ faqTitle: 'Veelgestelde Vragen',
76
+ bibliographyTitle: 'Waarschijnlijkheidsbibliografie',
77
+ ui: {
78
+ title: 'Dobbelsteen Roller',
79
+ description: 'Moge het geluk aan jouw zijde staan.',
80
+ rollBtn: 'Gooi Dobbelstenen',
81
+ totalLabel: 'Totaal',
82
+ historyLabel: 'Geschiedenis',
83
+ clearHistoryBtn: 'Wis Geschiedenis',
84
+ faqTitle: 'FAQ',
85
+ bibliographyTitle: 'Referenties',
86
+ addDiceLabel: 'Voeg dobbelstenen toe aan de zak',
87
+ bagLabel: 'Dobbelsteenzak',
88
+ emptyBagBtn: 'Leegmaken',
89
+ emptyBagText: 'Klik op de dobbelstenen om ze toe te voegen',
90
+ modifierLabel: 'Modifier',
91
+ rollManyLabel: 'Gooi $COUNT dobbelstenen',
92
+ rollOneLabel: 'Gooi $COUNT dobbelsteen',
93
+ preRollText: 'Voeg dobbelstenen toe en gooi',
94
+ emptyHistoryText: 'De geschiedenis van de worpen verschijnt hier'
95
+ },
96
+ seo: [
97
+ { type: 'title', text: 'De Kunst van de Willekeur: Geschiedenis en Wiskunde van Dobbelstenen', level: 2 },
98
+ { type: 'paragraph', html: 'Dobbelstenen behoren tot de oudste toevalsgeneratoren van de mensheid. <strong>Astragali</strong> — enkelbotjes van schapen en geiten — werden al in 5000 v.Chr. in Mesopotamië en Egypte als primitieve vierzijdige dobbelstenen gebruikt. De evolutie van gesneden bot naar moderne epoxyhars-icosaëders is niet alleen esthetisch: het is een reis door de kansrekening en het ontwerpen van spelmechanieken.' },
99
+ { type: 'title', text: 'De Standaard Dobbelsteenfamilie', level: 3 },
100
+ { type: 'paragraph', html: 'De meest verspreide set dobbelstenen in rollenspellen — gepopulariseerd door <strong>Dungeons &amp; Dragons</strong> in 1974 — bestaat uit de vijf Platonische lichamen plus twee extra vormen: d4 (tetraëder), d6 (kubus), d8 (octaëder), d10 (pentagonale trapezoëder), d12 (dodecaëder), d20 (icosaëder) en d100 (procentuele dobbelsteen). Elk veelvlak garandeert een uniforme verdeling: alle vlakken hebben precies dezelfde kans om boven te komen.' },
101
+ { type: 'list', items: [
102
+ '<strong>d4 – Tetraëder:</strong> Het gevaarlijkst als je er met blote voeten op stapt. Vier driehoekige vlakken, 25% kans per vlak. Veelgebruikt voor dolkschade of spreuken van laag niveau.',
103
+ '<strong>d6 – Kubus:</strong> De meest universele dobbelsteen. Aanwezig in alle bordspellen sinds het Egyptische Senet. Zijn kubusvormige geometrie garandeert perfecte gelijke verdeling.',
104
+ '<strong>d8 – Octaëder:</strong> De dobbelsteen van de speer of strijdbijl. Acht gelijkzijdige driehoekige vlakken. 12,5% kans per vlak.',
105
+ '<strong>d10 – Pentagonale trapezoëder:</strong> Het enige niet-Platonische lichaam in de standaardset. Twee tegenover elkaar liggende vlakken per "hoekpunt". Onmisbaar voor de d100 (twee gecombineerde d10\'s).',
106
+ '<strong>d12 – Dodecaëder:</strong> De dobbelsteen van de barbaar. Twaalf vijfhoekige vlakken. Ondergewaardeerd in veel systemen, hoofdrolspeler voor de D&D 5e Barbarian.',
107
+ '<strong>d20 – Icosaëder:</strong> De koning van de RPG. Twintig driehoekige vlakken. Hoofdrolspeler van het d20-systeem: bepaalt succes of falen van bijna alle acties.',
108
+ '<strong>d100 – Percentiel:</strong> Twee gecombineerde d10\'s (tientallen + eenheden). Definieert nauwkeurige waarschijnlijkheden in systemen zoals Call of Cthulhu of Warhammer Fantasy.',
109
+ ]},
110
+ { type: 'stats', items: [
111
+ { value: '5000 v.Chr.', label: 'Eerste dobbelstenen (astragali)', icon: 'mdi:history' },
112
+ { value: '1974', label: 'D&D populariseerde de set', icon: 'mdi:sword' },
113
+ { value: '7 types', label: 'Standaard RPG-dobbelstenen', icon: 'mdi:dice-multiple' },
114
+ { value: '2¹²⁸', label: 'JS willekeurige periode', icon: 'mdi:function-variant' },
115
+ ], columns: 4 },
116
+ { type: 'title', text: 'Kansrekening en Verdelingscurven', level: 3 },
117
+ { type: 'paragraph', html: 'Wanneer je een enkele dobbelsteen gooit, krijg je een <strong>discrete uniforme verdeling</strong>: elk resultaat heeft precies dezelfde kans (1/n). Maar zodra je meerdere dobbelstenen combineert, transformeert de wiskundige magie die vlakke curve in een <strong>benaderende normale verdeling</strong>. Daarom is 2d6 niet hetzelfde als 1d12: met twee zeszijdige dobbelstenen is de kans op een 7 gelijk aan 6/36 ≈ 16,7%, terwijl de uitersten (2 en 12) slechts 2,8% van de tijd voorkomen.' },
118
+ { type: 'tip', title: 'Voordeel en Nadeel (D&D 5e)', html: 'De <strong>Voordeel</strong>-mechaniek bestaat uit het gooien van 2d20 en het behouden van het hoogste resultaat. Wiskundig gezien verhoogt dit het gemiddelde van 10,5 naar ongeveer 13,8. <strong>Nadeel</strong> doet het tegenovergestelde: neem de laagste, waardoor het gemiddelde daalt naar ongeveer 7,2. Met onze roller kun je dit simuleren door twee d20\'s aan de zak toe te voegen en de individuele resultaten te vergelijken.' },
119
+ { type: 'title', text: 'Modifiers: De Brug tussen Dobbelsteen en Personage', level: 3 },
120
+ { type: 'paragraph', html: 'In de meeste RPG-systemen werkt de dobbelsteen niet alleen: een <strong>modifier</strong> die de vaardigheden van het personage vertegenwoordigt, wordt opgeteld of afgetrokken. In D&D 5e betekent een Strength-modifier van +5 dat je 1d20 gooit, er 5 bij optelt en het resultaat vergelijkt met de Armor Class van de vijand. Onze roller bevat een modifier-regelaar om deze mechanieken natuurgetrouw weer te geven.' },
121
+ { type: 'tip', title: 'Standaard Dobbelsteennotatie', html: 'De <strong>XdY+Z</strong> notatie is de feitelijke standaard in rollenspellen: X dobbelstenen van Y vlakken met modifier Z. "3d6+2" betekent gooi drie zeszijdige dobbelstenen en tel 2 op bij het totaal. Onze tool gebruikt deze notatie in de geschiedenis, zodat je je worpen gemakkelijk kunt delen of vastleggen.' },
122
+ { type: 'glossary', items: [
123
+ { term: 'Critical Hit', definition: 'Een worp met de maximale waarde op een dobbelsteen (bijv. een 20 op een d20). Activeert meestal speciale bonus-effecten in de meeste RPG-systemen.' },
124
+ { term: 'Fumble / Nat 1', definition: 'Het gooien van de minimumwaarde (1) op een dobbelsteen. Resulteert vaak in een dramatische mislukking of negatieve consequentie.' },
125
+ { term: 'Dice Pool', definition: 'Een verzameling dobbelstenen die tegelijkertijd worden gegooid. De pool in onze tool toont elk dobbelsteentype gegroepeerd naar aantal (bijv. 3d6 + 2d8).' },
126
+ { term: 'Modifier', definition: 'Een vast getal dat wordt opgeteld of afgetrokken van een resultaat van een worp, en dat de vaardigheid, attribuutbonus of situationele straf van een personage vertegenwoordigt.' },
127
+ { term: 'Percentielworp', definition: 'Een worp met twee d10\'s om een resultaat van 1–100 te produceren, gebruikt in op vaardigheden gebaseerde systemen waarbij vermogens als percentages worden gemeten.' },
128
+ ]},
129
+ ],
130
+ faq,
131
+ bibliography: [
132
+ { name: 'D&D Beyond – Dobbelsteenmechanica regels', url: 'https://www.dndbeyond.com/sources/basic-rules/using-ability-scores' },
133
+ { name: 'Roll20 – Virtuele tafel en dobbelsteensystemen', url: 'https://roll20.net/' },
134
+ { name: 'Pathfinder – d20 System Reference', url: 'https://paizo.com/pathfinder' },
135
+ ],
136
+ howTo,
137
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
138
+ };
@@ -0,0 +1,138 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { DiceRollerLocaleContent } from '../index';
3
+
4
+ const slug = 'kostka-do-gry';
5
+ const title = 'Kostka do Gry';
6
+ const description = 'Kompletny symulator kości do Twoich gier RPG i planszówek. Rzucaj k4, k6, k8, k10, k12, k20 oraz k100 z modyfikatorami i historią.';
7
+
8
+ const faq: DiceRollerLocaleContent['faq'] = [
9
+ {
10
+ question: 'Jak symulować rzut z ułatwieniem (advantage - D&D)?',
11
+ answer: 'Dodaj dwie kości k20 do worka, klikając dwukrotnie przycisk k20. Podczas rzutu obserwuj dwa indywidualne wyniki i zachowaj ten wyższy. Wyświetlona suma będzie ich dodatkiem, ale możesz zobaczyć każdą kość z osobna w zestawieniu wyników.',
12
+ },
13
+ {
14
+ question: 'Co oznacza zielony lub czerwony kolor wyników?',
15
+ answer: 'Zielone wyniki wskazują, że na kości wypał jej maksymalny możliwy wynik ("krytyk"). Czerwone wyniki oznaczają wartość minimalną ("1", najgorszy możliwy wynik). Dzięki temu można błyskawicznie dostrzec krytyczne sukcesy i pechowe rzuty.',
16
+ },
17
+ {
18
+ question: 'Czy mogę dodać kilka kości tego samego typu?',
19
+ answer: 'Tak. Każde kliknięcie na kość dodaje ją do worka. Jeśli klikniesz k6 trzy razy, worek pokaże "3k6". Aby zmniejszyć liczbę kości, kliknij przycisk "−", który pojawia się obok każdej grupy kości w worku.',
20
+ },
21
+ {
22
+ question: 'Czy kości cyfrowe są tak samo losowe jak fizyczne?',
23
+ answer: 'Statystycznie tak. Nowoczesne silniki JavaScript używają algorytmów pseudolosowych (xorshift128+) o bardzo wysokiej jakości rozkładu jednostajnego. Prawdziwa fizyczna kość może mieć drobne niedoskonałości produkcyjne, które wpływają na wyniki; cyfrowa kość jest wolna od tego problemu.',
24
+ },
25
+ {
26
+ question: 'Czym jest k100 i jak się go używa?',
27
+ answer: 'k100 (lub k%) generuje liczbę od 1 do 100 i jest używany w systemach gier opartych na procentach, takich jak Zew Cthulhu czy Warhammer Fantasy Roleplay. Reprezentuje "bezpośrednie prawdopodobieństwo": jeśli Twoja umiejętność Skradania wynosi 65%, musisz wyrzucić 65 lub mniej, aby odnieść sukces.',
28
+ },
29
+ ];
30
+
31
+ const howTo: DiceRollerLocaleContent['howTo'] = [
32
+ { name: 'Stwórz pulę kości', text: 'Klikaj przyciski kości (k4, k6, k8...), aby dodać je do swojej puli. Każde kliknięcie dodaje jedną kość wybranego typu. Możesz mieszać różne typy w jednym rzucie.' },
33
+ { name: 'Dostosuj modyfikator', text: 'Użyj przycisków "+" i "−" obok modyfikatora, aby zastosować premie lub kary (jak modyfikator atrybutu w D&D). Modyfikator jest automatycznie dodawany do sumy.' },
34
+ { name: 'Rzuć kośćmi', text: 'Naciśnij przycisk "Rzuć Kośćmi". Prawy panel pokazuje ostateczną sumę oraz rozbicie na każdą pojedynczą kość, z krytykami (maksimum) na zielono i pechami (minimum) na czerwono.' },
35
+ { name: 'Sprawdź historię', text: 'Każdy rzut jest zapisywany w historii wraz z użytym wyrażeniem kości, całkowitym wynikiem i dokładnym czasem. Możesz wyczyścić historię za pomocą odpowiedniego przycisku.' },
36
+ ];
37
+
38
+ const faqSchema: WithContext<FAQPage> = {
39
+ '@context': 'https://schema.org',
40
+ '@type': 'FAQPage',
41
+ mainEntity: faq.map((item) => ({
42
+ '@type': 'Question',
43
+ name: item.question,
44
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
45
+ })),
46
+ };
47
+
48
+ const howToSchema: WithContext<HowTo> = {
49
+ '@context': 'https://schema.org',
50
+ '@type': 'HowTo',
51
+ name: title,
52
+ description,
53
+ step: howTo.map((step) => ({
54
+ '@type': 'HowToStep',
55
+ name: step.name,
56
+ text: step.text,
57
+ })),
58
+ };
59
+
60
+ const appSchema: WithContext<SoftwareApplication> = {
61
+ '@context': 'https://schema.org',
62
+ '@type': 'SoftwareApplication',
63
+ name: title,
64
+ description,
65
+ applicationCategory: 'UtilitiesApplication',
66
+ operatingSystem: 'Web',
67
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
68
+ inLanguage: 'pl',
69
+ };
70
+
71
+ export const content: DiceRollerLocaleContent = {
72
+ slug,
73
+ title,
74
+ description,
75
+ faqTitle: 'Najczęściej Zadawane Pytania',
76
+ bibliographyTitle: 'Bibliografia Losowości',
77
+ ui: {
78
+ title: 'Kostka do Gry',
79
+ description: 'Niech szczęście ci sprzyja.',
80
+ rollBtn: 'Rzuć Kośćmi',
81
+ totalLabel: 'Suma',
82
+ historyLabel: 'Historia',
83
+ clearHistoryBtn: 'Wyczyść Historię',
84
+ faqTitle: 'FAQ',
85
+ bibliographyTitle: 'Źródła',
86
+ addDiceLabel: 'Dodaj kości do worka',
87
+ bagLabel: 'Worek na kości',
88
+ emptyBagBtn: 'Opróżnij',
89
+ emptyBagText: 'Kliknij kości, aby je dodać',
90
+ modifierLabel: 'Modyfikator',
91
+ rollManyLabel: 'Rzuć kośćmi ($COUNT)',
92
+ rollOneLabel: 'Rzuć kością ($COUNT)',
93
+ preRollText: 'Dodaj kości i rzuć',
94
+ emptyHistoryText: 'Tutaj pojawi się historia rzutów'
95
+ },
96
+ seo: [
97
+ { type: 'title', text: 'Sztuka Losowości: Historia i Matematyka Kości', level: 2 },
98
+ { type: 'paragraph', html: 'Kości to jedne z najstarszych generatorów losowości ludzkości. <strong>Astragali</strong> — kości skokowe owiec i kóz — były używane jako prymitywne czterościenne kości już 5000 lat p.n.e. w Mezopotamii i Egipcie. Ewolucja od rzeźbionej kości do nowoczesnych dwudziestościanów z żywicy epoksydowej to nie tylko kwestia estetyki: to podróż przez teorię prawdopodobieństwa i projektowanie mechanik gier.' },
99
+ { type: 'title', text: 'Standardowa Rodzina Kości', level: 3 },
100
+ { type: 'paragraph', html: 'Najbardziej rozpowszechniony zestaw kości w grach fabularnych — spopularyzowany przez grupę <strong>Dungeons &amp; Dragons</strong> w 1974 roku — składa się z pięciu brył platońskich oraz dwóch dodatkowych kształtów: k4 (czworościan), k6 (sześcian), k8 (ośmiościan), k10 (dwudziestościan deltoidalny), k12 (dwunastościan), k20 (dwudziestościan) oraz k100 (kość procentowa). Każdy wielościan gwarantuje rozkład jednostajny: wszystkie ścianki mają dokładnie takie samo prawdopodobieństwo wypadnięcia.' },
101
+ { type: 'list', items: [
102
+ '<strong>k4 – Czworościan:</strong> Najbardziej niebezpieczna, gdy nadepnie się na nią boso. Cztery trójkątne ścianki, 25% prawdopodobieństwa na ściankę. Powszechnie używana do obrażeń od sztyletów lub zaklęć niskiego poziomu.',
103
+ '<strong>k6 – Sześcian:</strong> Najbardziej uniwersalna kość. Obecna we wszystkich grach planszowych od czasu egipskiego senet. Jej sześcienna geometria gwarantuje doskonałą równomierność rozkładu.',
104
+ '<strong>k8 – Ośmiościan:</strong> Kość włóczni lub topora bojowego. Osiem ścianek będących trójkątami równobocznymi. 12,5% prawdopodobieństwa na ściankę.',
105
+ '<strong>k10 – Dwudziestościan deltoidalny:</strong> Jedyna bryła w standardowym zestawie, która nie jest bryłą platońską. Dwie przeciwległe ścianki na "wierzchołek". Niezbędna do k100 (dwie połączone k10).',
106
+ '<strong>k12 – Dwunastościan:</strong> Kość barbarzyńcy. Dwanaście pięciokątnych ścianek. Niedoceniana w wielu systemach, główna bohaterka barbarzyńcy w D&D 5e.',
107
+ '<strong>k20 – Dwudziestościan:</strong> Królowa gier RPG. Dwadzieścia trójkątnych ścianek. Protagonistka systemu d20: decyduje o sukcesie lub porażce niemal wszystkich działań.',
108
+ '<strong>k100 – Kość procentowa:</strong> Dwie połączone k10 (dziesiątki + jedności). Definiuje precyzyjne prawdopodobieństwo w systemach takich jak Zew Cthulhu czy Warhammer Fantasy.',
109
+ ]},
110
+ { type: 'stats', items: [
111
+ { value: '5000 p.n.e.', label: 'Pierwsze kości (astragali)', icon: 'mdi:history' },
112
+ { value: '1974', label: 'D&D spopularyzowało zestaw', icon: 'mdi:sword' },
113
+ { value: '7 typów', label: 'Standardowe kości RPG', icon: 'mdi:dice-multiple' },
114
+ { value: '2¹²⁸', label: 'Okres losowości JS', icon: 'mdi:function-variant' },
115
+ ], columns: 4 },
116
+ { type: 'title', text: 'Prawdopodobieństwo i Krzywe Rozkładu', level: 3 },
117
+ { type: 'paragraph', html: 'Rzucając pojedynczą kością, otrzymujesz <strong>dyskretny rozkład jednostajny</strong>: każdy wynik ma dokładnie takie samo prawdopodobieństwo (1/n). Jednak gdy tylko połączysz wiele kości, matematyczna magia przekształca tę płaską krzywą w <strong>przybliżony rozkład normalny</strong>. Dlatego 2k6 to nie to samo co 1k12: przy dwóch kostkach sześciościennych prawdopodobieństwo wyrzucenia 7 wynosi 6/36 ≈ 16,7%, podczas gdy skrajne wyniki (2 i 12) zdarzają się tylko w 2,8% przypadków.' },
118
+ { type: 'tip', title: 'Ułatwienie i Utrudnienie (D&D 5e)', html: 'Mechanika <strong>Ułatwienia</strong> polega na rzucie 2k20 i zachowaniu wyższego wyniku. Matematycznie podnosi to średnią z 10,5 do około 13,8. <strong>Utrudnienie</strong> robi coś przeciwnego: wybiera niższy wynik, obniżając średnią do około 7,2. Nasz symulator pozwala to zasymulować, dodając dwie k20 do worka i porównując indywidualne wyniki.' },
119
+ { type: 'title', text: 'Modyfikatory: Most Między Kością a Postacią', level: 3 },
120
+ { type: 'paragraph', html: 'W większości systemów RPG kość nie działa sama: dodaje się lub odejmuje <strong>modyfikator</strong> reprezentujący umiejętności postaci. W D&D 5e modyfikator Siły +5 oznacza, że rzucasz 1k20, dodajesz 5 i sprawdzasz wynik względem Klasy Pancerza przeciwnika. Nasz symulator zawiera kontrolkę modyfikatora, aby wiernie odzwierciedlać te mechaniki.' },
121
+ { type: 'tip', title: 'Standard Notacji Kości', html: 'Notacja <strong>XkY+Z</strong> jest de facto standardem w grach fabularnych: X kości o Y ściankach z modyfikatorem Z. "3k6+2" oznacza rzut trzema kośćmi sześciościennymi i dodanie 2 do sumy. Nasze narzędzie używa tej notacji w historii, dzięki czemu możesz łatwo dzielić się swoimi rzutami lub je zapisywać.' },
122
+ { type: 'glossary', items: [
123
+ { term: 'Trafienie krytyczne', definition: 'Wyrzucenie maksymalnej wartości na kości (np. 20 na k20). Zazwyczaj wyzwala specjalne efekty dodatkowe w większości systemów RPG.' },
124
+ { term: 'Pech / Naturalne 1', definition: 'Wyrzucenie minimalnej wartości (1) na kości. Często skutkuje dramatyczną porażką lub negatywnymi konsekwencjami.' },
125
+ { term: 'Pula kości', definition: 'Zbiór kości rzucanych jednocześnie. Pula w naszym narzędziu pokazuje każdy typ kości pogrupowany według liczby (np. 3k6 + 2k8).' },
126
+ { term: 'Modyfikator', definition: 'Stała liczba dodawana lub odejmowana od wyniku rzutu, reprezentująca umiejętność postaci, premię do atrybutu lub karę sytuacyjną.' },
127
+ { term: 'Rzut procentowy', definition: 'Rzut z użyciem dwóch k10 w celu uzyskania wyniku od 1 do 100, stosowany w systemach opartych na umiejętnościach, gdzie zdolności mierzone są w procentach.' },
128
+ ]},
129
+ ],
130
+ faq,
131
+ bibliography: [
132
+ { name: 'D&D Beyond – Zasady mechaniki kości', url: 'https://www.dndbeyond.com/sources/basic-rules/using-ability-scores' },
133
+ { name: 'Roll20 – Wirtualny stół i systemy kości', url: 'https://roll20.net/' },
134
+ { name: 'Pathfinder – Referencja systemu d20', url: 'https://paizo.com/pathfinder' },
135
+ ],
136
+ howTo,
137
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
138
+ };
@@ -0,0 +1,138 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { DiceRollerLocaleContent } from '../index';
3
+
4
+ const slug = 'lancador-de-dados';
5
+ const title = 'Lançador de Dados';
6
+ const description = 'Um simulador de dados completo para os seus jogos de RPG e de tabuleiro. Lance d4, d6, d8, d10, d12, d20 e d100 com modificadores e histórico.';
7
+
8
+ const faq: DiceRollerLocaleContent['faq'] = [
9
+ {
10
+ question: 'Como posso simular um lançamento com vantagem (D&D)?',
11
+ answer: 'Adicione dois dados d20 ao saco clicando duas vezes no botão d20. Ao lançar, observe os dois resultados individuais e fique com o mais alto. O total apresentado será a soma, mas pode ver cada dado separadamente no detalhe do resultado.',
12
+ },
13
+ {
14
+ question: 'O que significa a cor verde ou vermelha nos resultados?',
15
+ answer: 'Resultados verdes indicam que o dado obteve o seu valor máximo possível (um "crítico"). Resultados vermelhos indicam o valor mínimo (um "1", o pior resultado possível). Isto torna fácil detetar críticos e falhas críticas num relance.',
16
+ },
17
+ {
18
+ question: 'Posso adicionar vários dados do mesmo tipo?',
19
+ answer: 'Sim. Cada clique num dado adiciona-o ao saco. Se clicar no d6 três vezes, o saco mostrará "3d6". Para reduzir a contagem, clique no botão "−" que aparece ao lado de cada grupo de dados no saco.',
20
+ },
21
+ {
22
+ question: 'Os dados digitais são tão aleatórios como os físicos?',
23
+ answer: 'Estatisticamente, sim. Os motores de JavaScript modernos utilizam algoritmos pseudorandom (xorshift128+) com uma distribuição uniforme de altíssima qualidade. Um dado físico real pode ter pequenas imperfeições de fabrico que influenciam os resultados; o dado digital não tem esse problema.',
24
+ },
25
+ {
26
+ question: 'O que é o d100 e como é utilizado?',
27
+ answer: 'O d100 (ou d%) gera um número de 1 a 100 e é utilizado em sistemas de jogo baseados em percentagens, como Call of Cthulhu ou Warhammer Fantasy Roleplay. Representa a "probabilidade direta": se a sua perícia de Stealth for 65%, precisa de lançar 65 ou menos para ter sucesso.',
28
+ },
29
+ ];
30
+
31
+ const howTo: DiceRollerLocaleContent['howTo'] = [
32
+ { name: 'Construa o conjunto de dados', text: 'Clique nos botões dos dados (d4, d6, d8...) para os adicionar ao seu conjunto. Cada clique adiciona um dado do tipo selecionado. Pode misturar diferentes tipos no mesmo lançamento.' },
33
+ { name: 'Ajuste o modificador', text: 'Utilize os botões "+" e "−" ao lado do modificador para aplicar bónus ou penalizações (como o modificador de habilidade em D&D). O modificador é automaticamente adicionado ao total.' },
34
+ { name: 'Lance os dados', text: 'Pressione o botão "Lançar Dados". O painel direito mostra o total final e o detalhe de cada dado individual, com críticos (máximo) em verde e falhas (mínimo) em vermelho.' },
35
+ { name: 'Verifique o histórico', text: 'Cada lançamento é registado no histórico com a expressão de dados utilizada, o resultado total e a hora exata. Pode limpar o histórico com o botão correspondente.' },
36
+ ];
37
+
38
+ const faqSchema: WithContext<FAQPage> = {
39
+ '@context': 'https://schema.org',
40
+ '@type': 'FAQPage',
41
+ mainEntity: faq.map((item) => ({
42
+ '@type': 'Question',
43
+ name: item.question,
44
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
45
+ })),
46
+ };
47
+
48
+ const howToSchema: WithContext<HowTo> = {
49
+ '@context': 'https://schema.org',
50
+ '@type': 'HowTo',
51
+ name: title,
52
+ description,
53
+ step: howTo.map((step) => ({
54
+ '@type': 'HowToStep',
55
+ name: step.name,
56
+ text: step.text,
57
+ })),
58
+ };
59
+
60
+ const appSchema: WithContext<SoftwareApplication> = {
61
+ '@context': 'https://schema.org',
62
+ '@type': 'SoftwareApplication',
63
+ name: title,
64
+ description,
65
+ applicationCategory: 'UtilitiesApplication',
66
+ operatingSystem: 'Web',
67
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
68
+ inLanguage: 'pt',
69
+ };
70
+
71
+ export const content: DiceRollerLocaleContent = {
72
+ slug,
73
+ title,
74
+ description,
75
+ faqTitle: 'Perguntas Frequentes',
76
+ bibliographyTitle: 'Bibliografia da Sorte',
77
+ ui: {
78
+ title: 'Lançador de Dados',
79
+ description: 'Que a sorte esteja contigo.',
80
+ rollBtn: 'Lançar Dados',
81
+ totalLabel: 'Total',
82
+ historyLabel: 'Histórico',
83
+ clearHistoryBtn: 'Limpar Histórico',
84
+ faqTitle: 'FAQ',
85
+ bibliographyTitle: 'Referências',
86
+ addDiceLabel: 'Adicione dados ao saco',
87
+ bagLabel: 'Saco de dados',
88
+ emptyBagBtn: 'Esvaziar',
89
+ emptyBagText: 'Clique nos dados para adicionar',
90
+ modifierLabel: 'Modificador',
91
+ rollManyLabel: 'Lançar $COUNT dados',
92
+ rollOneLabel: 'Lançar $COUNT dado',
93
+ preRollText: 'Adicione os dados e lance',
94
+ emptyHistoryText: 'O histórico de lançamentos aparecerá aqui'
95
+ },
96
+ seo: [
97
+ { type: 'title', text: 'A Arte da Aleatoriedade: História e Matemática dos Dados', level: 2 },
98
+ { type: 'paragraph', html: 'Os dados são um dos geradores de aleatoriedade mais antigos da humanidade. Os <strong>astrágalos</strong> — ossos do tornozelo de ovelhas e cabras — eram utilizados como dados primitivos de quatro faces já em 5000 a.C. na Mesopotâmia e no Egito. A evolução do osso entalhado para os modernos icosaedros de resina epóxi não é apenas estética: é uma viagem através da teoria da probabilidade e do design de mecânicas de jogo.' },
99
+ { type: 'title', text: 'A Família Padrão de Dados', level: 3 },
100
+ { type: 'paragraph', html: 'O conjunto de dados mais difundido em jogos de interpretação (RPG) — popularizado por <strong>Dungeons &amp; Dragons</strong> em 1974 — consiste nos cinco sólidos platónicos mais duas formas adicionais: d4 (tetraedro), d6 (cubo), d8 (octaedro), d10 (trapezoedro pentagonal), d12 (dodecaedro), d20 (icosaedro) e d100 (dado percentil). Cada poliedro garante uma distribuição uniforme: todas as faces têm exatamente a mesma probabilidade de sair.' },
101
+ { type: 'list', items: [
102
+ '<strong>d4 – Tetraedro:</strong> O mais perigoso se for pisado descalço. Quatro faces triangulares, 25% de probabilidade por face. Comumente utilizado para dano de adagas ou feitiços de nível baixo.',
103
+ '<strong>d6 – Cubo:</strong> O dado mais universal. Presente em todos os jogos de tabuleiro desde o senet egípcio. A sua geometria cúbica garante uma equidistribuição perfeita.',
104
+ '<strong>d8 – Octaedro:</strong> O dado da lança ou do machado de batalha. Oito faces triangulares equiláteras. 12,5% de probabilidade por face.',
105
+ '<strong>d10 – Trapezoedro Pentagonal:</strong> O único sólido não platónico no conjunto padrão. Duas faces opostas por "vértice". Essencial para o d100 (dois d10 combinados).',
106
+ '<strong>d12 – Dodecaedro:</strong> O dado do bárbaro. Doze faces pentagonais. Subvalorizado em muitos sistemas, protagonista no Bárbaro de D&D 5e.',
107
+ '<strong>d20 – Icosaedro:</strong> O rei do RPG. Vinte faces triangulares. Protagonista do sistema d20: determina o sucesso ou falha de quase todas as ações.',
108
+ '<strong>d100 – Percentil:</strong> Dois d10 combinados (dezenas + unidades). Define probabilidades precisas em sistemas como Call of Cthulhu ou Warhammer Fantasy.',
109
+ ]},
110
+ { type: 'stats', items: [
111
+ { value: '5000 a.C.', label: 'Primeiros dados (astrágalos)', icon: 'mdi:history' },
112
+ { value: '1974', label: 'D&D popularizou o conjunto', icon: 'mdi:sword' },
113
+ { value: '7 tipos', label: 'Dados padrão de RPG', icon: 'mdi:dice-multiple' },
114
+ { value: '2¹²⁸', label: 'Período aleatório de JS', icon: 'mdi:function-variant' },
115
+ ], columns: 4 },
116
+ { type: 'title', text: 'Probabilidades e Curvas de Distribuição', level: 3 },
117
+ { type: 'paragraph', html: 'Quando lança um único dado, obtém uma <strong>distribuição uniforme discreta</strong>: cada resultado tem exatamente a mesma probabilidade (1/n). Mas assim que combina vários dados, a magia matemática transforma essa curva plana numa <strong>distribuição normal aproximada</strong>. É por isso que 2d6 não é o mesmo que 1d12: com dois dados de seis faces a probabilability de lançar um 7 é 6/36 ≈ 16,7%, enquanto os extremos (2 e 12) ocorrem apenas 2,8% das vezes.' },
118
+ { type: 'tip', title: 'Vantagem e Desvantagem (D&D 5e)', html: 'A mecânica de <strong>Vantagem</strong> consiste em lançar 2d20 e ficar com o resultado mais alto. Matematicamente, isto eleva a média de 10,5 para aproximadamente 13,8. A <strong>Desvantagem</strong> faz o oposto: escolha o mais baixo, baixando a média para cerca de 7,2. O nosso lançador permite simular isto adicionando dois d20 ao saco e comparando os resultados individuais.' },
119
+ { type: 'title', text: 'Modificadores: A Ponte entre o Dado e a Personagem', level: 3 },
120
+ { type: 'paragraph', html: 'Na maioria dos sistemas de RPG, o dado não atua sozinho: um <strong>modificador</strong> representativo das habilidades da personagem é adicionado ou subtraído. No D&D 5e, um modificador de Força de +5 significa que lança 1d20, adiciona 5 e verifica o resultado contra a Classe de Armadura do inimigo. O nosso lançador inclui um controlo de modificador para refletir fielmente estas mecânicas.' },
121
+ { type: 'tip', title: 'Padrão de Notação de Dados', html: 'A notação <strong>XdY+Z</strong> é o padrão de facto em jogos de RPG: X dados de Y faces com modificador Z. "3d6+2" significa lançar três dados de seis faces e somar 2 ao total. A nossa ferramenta utiliza esta notazione no histórico para que possa facilmente partilhar ou registar os seus lançamentos.' },
122
+ { type: 'glossary', items: [
123
+ { term: 'Ataque Crítico', definition: 'Um lançamento do valor máximo num dado (ex., lançar 20 num d20). Geralmente ativa efeitos de bónus especiais na maioria dos sistemas de RPG.' },
124
+ { term: 'Falha Crítica / 1 Natural', definition: 'Lançar o valor mínimo (1) num dado. Frequentemente resulta numa falha dramática ou consequência negativa.' },
125
+ { term: 'Dice Pool', definition: 'Uma coleção de dados lançados simultaneamente. O conjunto na nossa ferramenta mostra cada tipo de dado agrupado por contagem (ex., 3d6 + 2d8).' },
126
+ { term: 'Modificador', definition: 'Um número fixo somado ou subtraído do resultado de um lançamento, representando a habilidade da personagem, bónus de atributo ou penalização situacional.' },
127
+ { term: 'Lançamento Percentil', definition: 'Um lançamento que utiliza dois d10 para produzir um resultado de 1–100, utilizado em sistemas baseados em perícias onde as habilidades são medidas em percentagens.' },
128
+ ]},
129
+ ],
130
+ faq,
131
+ bibliography: [
132
+ { name: 'D&D Beyond – Regras de mecânicas de dados', url: 'https://www.dndbeyond.com/sources/basic-rules/using-ability-scores' },
133
+ { name: 'Roll20 – Mesa virtual e sistemas de dados', url: 'https://roll20.net/' },
134
+ { name: 'Pathfinder – Referência de Sistema d20', url: 'https://paizo.com/pathfinder' },
135
+ ],
136
+ howTo,
137
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
138
+ };
@@ -0,0 +1,138 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { DiceRollerLocaleContent } from '../index';
3
+
4
+ const slug = 'dice-roller-ru';
5
+ const title = 'Симулятор костей';
6
+ const description = 'Полный симулятор костей для ваших RPG и настольных игр. Бросайте d4, d6, d8, d10, d12, d20 и d100 с модификаторами и историей.';
7
+
8
+ const faq: DiceRollerLocaleContent['faq'] = [
9
+ {
10
+ question: 'Как симулировать бросок с преимуществом (D&D)?',
11
+ answer: 'Добавьте два кубика d20 в мешочек, дважды нажав на кнопку d20. При броске обратите внимание на два отдельных результата и оставьте больший. Отображаемое общее число будет их суммой, но вы можете увидеть каждый кубик отдельно в детализации результатов.',
12
+ },
13
+ {
14
+ question: 'Что означает зеленый или красный цвет в результатах?',
15
+ answer: 'Зеленый результат означает, что на кубике выпало максимально возможное значение («критический успех»). Красный результат означает минимальное значение («1», худший из возможных результатов). Это позволяет мгновенно замечать «криты» и «провалы».',
16
+ },
17
+ {
18
+ question: 'Можно ли добавить несколько костей одного типа?',
19
+ answer: 'Да. Каждое нажатие на кубик добавляет его в мешочек. Если вы нажмете d6 три раза, в мешочке появится «3d6». Чтобы уменьшить количество, нажмите кнопку «−» рядом с группой кубиков в мешочке.',
20
+ },
21
+ {
22
+ question: 'Насколько цифровые кости случайны по сравнению с настоящими?',
23
+ answer: 'Статистически — абсолютно. Современные движки JavaScript используют алгоритмы псевдослучайных чисел (xorshift128+) с очень высоким качеством равномерного распределения. Настоящий физический кубик может иметь микродефекты изготовления, влияющие на результат; у цифрового кубика такой проблемы нет.',
24
+ },
25
+ {
26
+ question: 'Что такое d100 и как его использовать?',
27
+ answer: 'd100 (или d%) генерирует число от 1 до 100 и используется в игровых системах на основе процентов, таких как Call of Cthulhu или Warhammer Fantasy Roleplay. Он представляет собой «прямую вероятность»: если ваш навык Скрытность равен 65%, вам нужно выбросить 65 или меньше для успеха.',
28
+ },
29
+ ];
30
+
31
+ const howTo: DiceRollerLocaleContent['howTo'] = [
32
+ { name: 'Создайте пул костей', text: 'Нажимайте на кнопки кубиков (d4, d6, d8...), чтобы добавить их в свой пул. Каждое нажатие добавляет один кубик выбранного типа. Вы можете смешивать разные типы в одном броске.' },
33
+ { name: 'Настройте модификатор', text: 'Используйте кнопки «+» и «−» рядом с модификатором, чтобы применить бонусы или штрафы (например, модификатор характеристики в D&D). Модификатор автоматически добавляется к общей сумме.' },
34
+ { name: 'Бросайте кости', text: 'Нажмите кнопку «Бросить кости». На правой панели отобразится итоговая сумма и детализация каждого кубика: критические успехи (максимум) выделены зеленым, а провалы (минимум) — красным.' },
35
+ { name: 'История бросков', text: 'Каждый бросок записывается в историю с указанием формулы кубиков, общего результата и точного времени. Вы можете очистить историю соответствующей кнопкой.' },
36
+ ];
37
+
38
+ const faqSchema: WithContext<FAQPage> = {
39
+ '@context': 'https://schema.org',
40
+ '@type': 'FAQPage',
41
+ mainEntity: faq.map((item) => ({
42
+ '@type': 'Question',
43
+ name: item.question,
44
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
45
+ })),
46
+ };
47
+
48
+ const howToSchema: WithContext<HowTo> = {
49
+ '@context': 'https://schema.org',
50
+ '@type': 'HowTo',
51
+ name: title,
52
+ description,
53
+ step: howTo.map((step) => ({
54
+ '@type': 'HowToStep',
55
+ name: step.name,
56
+ text: step.text,
57
+ })),
58
+ };
59
+
60
+ const appSchema: WithContext<SoftwareApplication> = {
61
+ '@context': 'https://schema.org',
62
+ '@type': 'SoftwareApplication',
63
+ name: title,
64
+ description,
65
+ applicationCategory: 'UtilitiesApplication',
66
+ operatingSystem: 'Web',
67
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
68
+ inLanguage: 'ru',
69
+ };
70
+
71
+ export const content: DiceRollerLocaleContent = {
72
+ slug,
73
+ title,
74
+ description,
75
+ faqTitle: 'Часто задаваемые вопросы',
76
+ bibliographyTitle: 'Библиография случая',
77
+ ui: {
78
+ title: 'Симулятор костей',
79
+ description: 'Пусть удача сопутствует вам.',
80
+ rollBtn: 'Бросить кости',
81
+ totalLabel: 'Итого',
82
+ historyLabel: 'История',
83
+ clearHistoryBtn: 'Очистить историю',
84
+ faqTitle: 'FAQ',
85
+ bibliographyTitle: 'Ссылки',
86
+ addDiceLabel: 'Добавить кости в мешочек',
87
+ bagLabel: 'Мешочек костей',
88
+ emptyBagBtn: 'Очистить',
89
+ emptyBagText: 'Нажмите на кости, чтобы добавить их',
90
+ modifierLabel: 'Модификатор',
91
+ rollManyLabel: 'Бросить $COUNT костей',
92
+ rollOneLabel: 'Бросить $COUNT кость',
93
+ preRollText: 'Добавьте кости и бросайте',
94
+ emptyHistoryText: 'История бросков появится здесь'
95
+ },
96
+ seo: [
97
+ { type: 'title', text: 'Искусство случая: история и математика игровых костей', level: 2 },
98
+ { type: 'paragraph', html: 'Кости — один из старейших генераторов случайности, созданных человечеством. <strong>Астрагалы</strong> — пяточные кости овец и коз — использовались как примитивные четырехгранные кости еще в 5000 году до н. э. в Месопотамии и Египте. Эволюция от резной кости до современных икосаэдров из эпоксидной смолы — это не просто эстетика: это путь сквозь теорию вероятностей и проектирование игровых механик.' },
99
+ { type: 'title', text: 'Стандартное семейство костей', level: 3 },
100
+ { type: 'paragraph', html: 'Самый распространенный набор костей в ролевых играх, популяризированный <strong>Dungeons &amp; Dragons</strong> в 1974 году, состоит из пяти Платоновых тел и двух дополнительных форм: d4 (тетраэдр), d6 (куб), d8 (октаэдр), d10 (пентагональный трапецоэдр), d12 (додекаэдр), d20 (икосаэдр) и d100 (процентный кубик). Каждый многогранник гарантирует равномерное распределение: все грани имеют абсолютно одинаковую вероятность выпадения.' },
101
+ { type: 'list', items: [
102
+ '<strong>d4 — тетраэдр:</strong> Самый опасный, если наступить на него босиком. Четыре треугольные грани, вероятность 25% на каждую. Обычно используется для урона кинжалом или заклинаний низкого уровня.',
103
+ '<strong>d6 — куб:</strong> Самый универсальный кубик. Присутствует во всех настольных играх со времен египетского сенета. Его кубическая геометрия гарантирует идеальное равнораспределение.',
104
+ '<strong>d8 — октаэдр:</strong> Кубик копья или боевого топора. Восемь равносторонних треугольных граней. Вероятность 12,5% на грань.',
105
+ '<strong>d10 — пентагональный трапецоэдр:</strong> Единственное не Платоново тело в стандартном наборе. Две противоположные грани на каждую «вершину». Необходим для d100 (два кубика d10 вместе).',
106
+ '<strong>d12 — додекаэдр:</strong> Кубик варвара. Двенадцать пятиугольных граней. Недооценен во многих системах, главный инструмент варвара в D&D 5e.',
107
+ '<strong>d20 — икосаэдр:</strong> Король RPG. Двадцать треугольных граней. Главный герой системы d20: определяет успех или провал почти всех действий.',
108
+ '<strong>d100 — проценты:</strong> Два кубика d10 вместе (десятки + единицы). Определяет точные вероятности в таких системах, как Call of Cthulhu или Warhammer Fantasy.',
109
+ ]},
110
+ { type: 'stats', items: [
111
+ { value: '5000 лет до н.э.', label: 'Первые кости (астрагалы)', icon: 'mdi:history' },
112
+ { value: '1974', label: 'D&D популяризировала набор', icon: 'mdi:sword' },
113
+ { value: '7 типов', label: 'Стандартные кости RPG', icon: 'mdi:dice-multiple' },
114
+ { value: '2¹²⁸', label: 'Период случайности JS', icon: 'mdi:function-variant' },
115
+ ], columns: 4 },
116
+ { type: 'title', text: 'Вероятности и кривые распределения', level: 3 },
117
+ { type: 'paragraph', html: 'Когда вы бросаете один кубик, вы получаете <strong>дискретное равномерное распределение</strong>: каждый результат имеет абсолютно одинаковую вероятность (1/n). Но как только вы объединяете несколько кубиков, математическая магия превращает эту плоскую кривую в <strong>приблизительное нормальное распределение</strong>. Вот почему 2d6 — это не то же самое, что 1d12: с двумя шестигранными кубиками вероятность выбросить 7 составляет 6/36 ≈ 16,7%, в то время как крайние значения (2 и 12) выпадают лишь в 2,8% случаев.' },
118
+ { type: 'tip', title: 'Преимущество и помеха (D&D 5e)', html: 'Механика <strong>Преимущества</strong> заключается в броске 2d20 и выборе большего результата. Математически это поднимает среднее значение с 10,5 до примерно 13,8. <strong>Помеха</strong> делает обратное: берется меньший результат, что снижает среднее до 7,2. Наш симулятор позволяет это воссоздать, добавив два d20 в мешочек и сравнив результаты.' },
119
+ { type: 'title', text: 'Модификаторы: мост между кубиком и персонажем', level: 3 },
120
+ { type: 'paragraph', html: 'В большинстве ролевых систем кубик не действует в одиночку: добавляется или вычитается <strong>модификатор</strong>, представляющий способности персонажа. В D&D 5e модификатор Силы +5 означает, что вы бросаете 1d20, прибавляете 5 и сравниваете результат с Классом Брони врага. Наш симулятор включает управление модификатором, чтобы точно отражать эти механики.' },
121
+ { type: 'tip', title: 'Стандарт нотации костей', html: 'Нотация <strong>XdY+Z</strong> является стандартом де-факто в ролевых играх: X кубиков с Y гранями плюс модификатор Z. «3d6+2» означает бросок трех шестигранных костей и прибавление 2 к итогу. Наш инструмент использует эту нотацию в истории, чтобы вы могли легко делиться бросками или записывать их.' },
122
+ { type: 'glossary', items: [
123
+ { term: 'Критический успех', definition: 'Выпадение максимального значения на кубике (например, 20 на d20). Обычно вызывает особые бонусные эффекты в большинстве систем RPG.' },
124
+ { term: 'Провал / Натуральная 1', definition: 'Выпадение минимального значения (1) на кубике. Часто приводит к драматическому провалу или негативным последствиям.' },
125
+ { term: 'Пул костей', definition: 'Группа костей, бросаемых одновременно. Пул в нашем инструменте показывает каждый тип кубика, сгруппированный по количеству (например, 3d6 + 2d8).' },
126
+ { term: 'Модификатор', definition: 'Фиксированное число, прибавляемое к результату броска или вычитаемое из него, представляющее навык персонажа, бонус характеристики или штраф за ситуацию.' },
127
+ { term: 'Процентный бросок', definition: 'Бросок с использованием двух d10 для получения результата от 1 до 100, используется в системах навыков, где способности измеряются в процентах.' },
128
+ ]},
129
+ ],
130
+ faq,
131
+ bibliography: [
132
+ { name: 'D&D Beyond – правила механики костей', url: 'https://www.dndbeyond.com/sources/basic-rules/using-ability-scores' },
133
+ { name: 'Roll20 – виртуальный стол и системы костей', url: 'https://roll20.net/' },
134
+ { name: 'Pathfinder – справочник системы d20', url: 'https://paizo.com/pathfinder' },
135
+ ],
136
+ howTo,
137
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
138
+ };