@jjlmoya/utils-tabletop 1.7.0 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/entries.ts +14 -1
- package/src/index.ts +1 -0
- package/src/tests/locale_completeness.test.ts +1 -1
- package/src/tests/tool_validation.test.ts +1 -1
- package/src/tool/decision-wheel/drawing.ts +1 -1
- package/src/tool/investigation-board/interactDrag.ts +2 -1
- package/src/tool/lunar-tide-tracker/bibliography.astro +16 -0
- package/src/tool/lunar-tide-tracker/bibliography.ts +8 -0
- package/src/tool/lunar-tide-tracker/client.ts +264 -0
- package/src/tool/lunar-tide-tracker/component.astro +103 -0
- package/src/tool/lunar-tide-tracker/entry.ts +26 -0
- package/src/tool/lunar-tide-tracker/i18n/de.ts +156 -0
- package/src/tool/lunar-tide-tracker/i18n/en.ts +214 -0
- package/src/tool/lunar-tide-tracker/i18n/es.ts +157 -0
- package/src/tool/lunar-tide-tracker/i18n/fr.ts +156 -0
- package/src/tool/lunar-tide-tracker/i18n/id.ts +156 -0
- package/src/tool/lunar-tide-tracker/i18n/it.ts +156 -0
- package/src/tool/lunar-tide-tracker/i18n/ja.ts +156 -0
- package/src/tool/lunar-tide-tracker/i18n/ko.ts +214 -0
- package/src/tool/lunar-tide-tracker/i18n/nl.ts +214 -0
- package/src/tool/lunar-tide-tracker/i18n/pl.ts +214 -0
- package/src/tool/lunar-tide-tracker/i18n/pt.ts +214 -0
- package/src/tool/lunar-tide-tracker/i18n/ru.ts +214 -0
- package/src/tool/lunar-tide-tracker/i18n/sv.ts +214 -0
- package/src/tool/lunar-tide-tracker/i18n/tr.ts +214 -0
- package/src/tool/lunar-tide-tracker/i18n/zh.ts +214 -0
- package/src/tool/lunar-tide-tracker/index.ts +9 -0
- package/src/tool/lunar-tide-tracker/logic.test.ts +56 -0
- package/src/tool/lunar-tide-tracker/logic.ts +76 -0
- package/src/tool/lunar-tide-tracker/lunar-tide-tracker.css +494 -0
- package/src/tool/lunar-tide-tracker/seo.astro +16 -0
- package/src/tool/lunar-tide-tracker/types.ts +70 -0
- package/src/tools.ts +2 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
2
|
+
import type { LunarTideLocaleContent } from '../entry';
|
|
3
|
+
|
|
4
|
+
export const content: LunarTideLocaleContent = {
|
|
5
|
+
slug: 'ay-fazi-gelgit-hesaplayici',
|
|
6
|
+
title: 'Masaustu RPGler icin Ay Fazi Hesaplayici: Ozel Fantezi Aylarini ve Gelgit Dongulerini Takip Edin',
|
|
7
|
+
description: 'Herhangi bir fantezi dunyasi icin ozel yorunge periyotlariyla ay fazlarini hesaplayin. Ayni anda birden fazla ayi takip edin, 10 gunluk tahminleri gorun ve D&D, Pathfinder veya herhangi bir RPG\'deki buyu ve hava sistemleri icin birlestirilmis gelgit seviyesini alin.',
|
|
8
|
+
ui: {
|
|
9
|
+
title: 'Ay Fazi ve Mistik Gelgit Takipcisi',
|
|
10
|
+
moonsTitle: 'Ay Yapilandirmasi',
|
|
11
|
+
addMoon: 'Ozel Ay Ekle',
|
|
12
|
+
removeMoon: 'Ayi Kaldir',
|
|
13
|
+
moonName: 'Ay Adi',
|
|
14
|
+
orbitalPeriod: 'Yorunge Periyodu (Gun)',
|
|
15
|
+
startingOffset: 'Baslangic Ofseti (Gun)',
|
|
16
|
+
timelineTitle: 'Zaman Kontrolleri',
|
|
17
|
+
currentDay: 'Mevcut Kampanya Gunu',
|
|
18
|
+
tideTitle: 'Mistik Gelgit Durumu',
|
|
19
|
+
tideLevel: 'Gelgit Enerji Seviyesi',
|
|
20
|
+
magicModifier: 'Buyu Gelgit Etkisi',
|
|
21
|
+
forecastTitle: 'Ay Fazi ve Gelgit Tahmini',
|
|
22
|
+
dayLabel: 'Gun',
|
|
23
|
+
resetButton: '0. Gune Sifirla',
|
|
24
|
+
presetTitle: 'Kampanya Hazir Ayarlari',
|
|
25
|
+
presetSingle: 'Klasik Ay',
|
|
26
|
+
presetDouble: 'Buyunun Ikiz Aylari',
|
|
27
|
+
presetTriple: 'Uclu Tutulma Diyari',
|
|
28
|
+
newMoon: 'Yeni Ay',
|
|
29
|
+
waxingCrescent: 'Hilal (Buyuyen)',
|
|
30
|
+
firstQuarter: 'Ilk Dordun',
|
|
31
|
+
waxingGibbous: 'Siskin Ay (Buyuyen)',
|
|
32
|
+
fullMoon: 'Dolunay',
|
|
33
|
+
waningGibbous: 'Siskin Ay (Kuculen)',
|
|
34
|
+
lastQuarter: 'Son Dordun',
|
|
35
|
+
waningCrescent: 'Hilal (Kuculen)',
|
|
36
|
+
},
|
|
37
|
+
seo: [
|
|
38
|
+
{ type: 'title', text: 'Bir Fantezi RPG Kampanyasinda Ay Fazlari Nasil Takip Edilir', level: 2 },
|
|
39
|
+
{ type: 'paragraph', html: 'Cogu fantezi evreninde aylarin yorunge periyotlari, gercek dunyadaki 29,5 gunluk ay dongusunden farklidir. <strong>Yorunge Periyodu</strong> alani, bir ayin tam bir donguyu tamamlamasi icin kac oyun ici gun gerektigini belirler. Dunya\'nin ayi 29 gun surer; Eberron evreni 28 gun kullanir; Tolkien\'in Orta Dunya\'sinda ay dongusu 30\'a yakindir. Bunu dunyanizin anlatisina gore ayarlayin veya istediginiz tutulma sikligini uretecek 5 ila 60 gun arasinda herhangi bir sayi secin.' },
|
|
40
|
+
{
|
|
41
|
+
type: 'stats',
|
|
42
|
+
items: [
|
|
43
|
+
{ value: '3', label: 'Ayni anda takip edilen ay' },
|
|
44
|
+
{ value: '10', label: 'Gunluk tahmin araligi' },
|
|
45
|
+
{ value: '5', label: 'Gelgit durumu (Durgun\'dan Kabarma\'ya)' }
|
|
46
|
+
],
|
|
47
|
+
columns: 3
|
|
48
|
+
},
|
|
49
|
+
{ type: 'title', text: 'Baslangic Ofseti Alanini Anlamak', level: 2 },
|
|
50
|
+
{ type: 'paragraph', html: '<strong>Baslangic Ofseti</strong>, bir ayin 0. kampanya gununde dongusunun neresinde oldugunu kaydirir. 0 ofseti, ayin Yeni Ay\'da basladigi anlamina gelir. Yorunge periyodunun yarisina esit bir ofset, onu Dolunay\'da baslatir. Bunu kampanyanizin acilis sahnesinde tanimlanan faza uyacak sekilde veya iki ayin her zaman ayni hizada olmamasi icin farkli konumlarda baslamasini saglamak amaciyla kullanin.' },
|
|
51
|
+
{ type: 'title', text: 'Gelgit Seviyesinin Oyununuz Icin Anlami', level: 2 },
|
|
52
|
+
{ type: 'paragraph', html: 'Gelgit seviyesi, tum aktif aylarin mevcut fazlarina gore kutle cekim kuvvetini birlestirir. <strong>Kabarma Gelgiti</strong> (%75\'in uzerinde), aylar dolunay veya yeni ay evresinde neredeyse ayni hizaya geldiginde ve ayni yonde cekim yaptiginda olusur. <strong>Durgun Gelgit</strong> (%30\'un altinda), aylar zit evrelerde oldugunda ve birbirlerini kismen iptal ettiginde meydana gelir. Bunu dogrudan herhangi bir mekanik sisteme baglayabilirsiniz: buyu kurtarma sirasi bonuslari, druid sekil degistirme suresi, kurt adam donusum esikleri veya kiyi haritalarinda firtina siddeti.' },
|
|
53
|
+
{
|
|
54
|
+
type: 'comparative',
|
|
55
|
+
items: [
|
|
56
|
+
{
|
|
57
|
+
title: 'Tek Ay',
|
|
58
|
+
description: 'Gercek dunyaya cok benzeyen veya tek bir baskin ayi olan evrenler icin en iyisidir. 8 asamali basit dongu, referans olmadan takip etmesi kolay.',
|
|
59
|
+
icon: 'mdi:moon-full',
|
|
60
|
+
highlight: false,
|
|
61
|
+
points: [
|
|
62
|
+
'D&D Forgotten Realms (Selune, 30 gun) icin uygun',
|
|
63
|
+
'Kurt adam ve likantrop kampanyalari',
|
|
64
|
+
'Dolunay\'a bagli korku oturumlari'
|
|
65
|
+
]
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
title: 'Ikiz Aylar',
|
|
69
|
+
description: 'Yuksek fantezi evrenlerinde yaygindir. Sik sik kismi hizalanmalar ve ilginc orta dongu gelgitleri yaratir. Hizalanmalar kabaca her LCM(period1, period2) gunde bir gerceklesir.',
|
|
70
|
+
icon: 'mdi:moon-waxing-crescent',
|
|
71
|
+
highlight: true,
|
|
72
|
+
points: [
|
|
73
|
+
'Eberron (Rhaan 28g + Aryth 12g)',
|
|
74
|
+
'Onceden tahmin edilebilir tutulma mevsimleri yaratir',
|
|
75
|
+
'Druidik veya element buyu sistemleri icin uygun'
|
|
76
|
+
]
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
title: 'Uclu Aylar',
|
|
80
|
+
description: 'Nadir uclu hizalanmalar onceden tahmin edilemez dalgalanmalar yaratir. Birlestirilmis gelgit, bu arac olmadan kaotik ve tahmin etmesi zor hale gelir; bu da onu dramatik acidan kullanisli kilar.',
|
|
81
|
+
icon: 'mdi:moon-waning-crescent',
|
|
82
|
+
highlight: false,
|
|
83
|
+
points: [
|
|
84
|
+
'Hizalama sirasinda vahsi buyu dalgalanma tablolari',
|
|
85
|
+
'Pathfinder Golarion tarzi karmasiklik',
|
|
86
|
+
'Destansi kampanyalar icin uzun donemli donguler'
|
|
87
|
+
]
|
|
88
|
+
}
|
|
89
|
+
],
|
|
90
|
+
columns: 3
|
|
91
|
+
},
|
|
92
|
+
{ type: 'title', text: 'Fantezi Dunyalari Icin Yaygin Yorunge Periyotlari', level: 3 },
|
|
93
|
+
{
|
|
94
|
+
type: 'glossary',
|
|
95
|
+
items: [
|
|
96
|
+
{ term: 'Selune (Forgotten Realms)', definition: '30 gunluk yorunge periyodu, tek ay. 1. oturumda dolunayda baslamak icin 15 ofsetini kullanin.' },
|
|
97
|
+
{ term: 'Eberron Aylari', definition: 'Eberron\'un 9 ila 28 gun arasinda degisen periyotlarla 12 ayi vardir. Her birini ayri bir ay ornegi olarak calistirin veya hikayeyle en ilgili ikisini secin.' },
|
|
98
|
+
{ term: 'Golarion (Pathfinder)', definition: 'Golarion\'un Somal adinda 29 gunluk donguye sahip tek bir ayi vardir. Karanlik doku olaylari, ofset girimli ikinci bir dusuk periyotlu ay eklenerek modellenebilir.' },
|
|
99
|
+
{ term: 'Ozel Dunya', definition: '15 gunluk bir ay, yilda 24 dolunay uretir. 45 gunluk bir ay kabaca 8 dolunay uretir. Daha kisa periyotlar daha sik tutulma olayi anlamina gelir ancak anlati agirligini azaltir.' }
|
|
100
|
+
]
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
type: 'diagnostic',
|
|
104
|
+
variant: 'info',
|
|
105
|
+
title: 'Ipucu: 1. Oturum Icin Belirli Bir Faz Ayarlama',
|
|
106
|
+
icon: 'mdi:information-outline',
|
|
107
|
+
badge: 'KURULUM IPUCU',
|
|
108
|
+
html: 'Kampanyaniz hilal ayinda basliyorsa, ofseti yorunge periyodunun yaklasik %20\'sine ayarlayin. Dolunay baslangici icin periyodun %50\'sini ofset olarak kullanin. Ornegin, 28 gunluk bir ay dolunayda baslayacaksa 14 ofsetini kullanin. Gun sayacini mevcut kampanya gununuze ilerletin; tahmin, sonraki 10 gunu otomatik olarak gosterecektir.'
|
|
109
|
+
}
|
|
110
|
+
],
|
|
111
|
+
faq: [
|
|
112
|
+
{ question: 'Fantezi dunyam icin hangi yorunge periyodunu kullanmaliyim?', answer: 'Eger evreniniz belirtmiyorsa, tek bir ay icin 28 ila 30 gun idealdir. Birden fazla ay icin, birbirlerinin basit katlari olmayan periyotlar secin (orn. 20 ve 27) ki hizalanmalar cok sik tekrarlanmasin. Daha kisa periyotlar (10 ila 15 gun), sik sik kucuk gelgitler olusturan ikincil aylar icin iyi calisir.' },
|
|
113
|
+
{ question: 'Iki ayi belirli bir kampanya aninda nasil hizalarim?', answer: 'Her iki ayi da ayni ofset degerine ayarlayin. 0. Gunde ayni fazda baslarlar ve iki periyotlarinin her ortak katinda tekrar hizalanirlar. Onlari sasirtmak icin, ikinci aya yorunge periyodunun yarisina esit bir ofset verin, boylece zit konumlarda baslarlar.' },
|
|
114
|
+
{ question: 'Kabarma Gelgiti oyun terimleriyle ne anlama gelir?', answer: 'Kabarma Gelgiti, tum aktif aylarin ayni hizada cekim yaptigi ve maksimum gelgit enerjisi urettigi anlamina gelir. Bunu vahsi buyu dalgalanmalarini tetiklemek, iyilestirme buyusu menzillerini artirmak, firtina siddetini kotulestirmek veya dunyanizdaki dini gruplar icin kutsal bir gece olarak isaretlemek icin kullanabilirsiniz.' },
|
|
115
|
+
{ question: 'Durgun Gelgit oyun terimleriyle ne anlama gelir?', answer: 'Durgun Gelgit, aylarin birbirini kismen iptal ettigi durumdur. Anti-buyu etkileri, denizde olu sakinlik veya onceden tahmin edilebilir buyu baskilamasi gerektiren kotu karakterlerin planlarini uygulamasi icin iyi bir andir.' },
|
|
116
|
+
{ question: 'Bunu Call of Cthulhu veya korku kampanyalari icin kullanabilir miyim?', answer: 'Evet. 29 gunluk tek bir ay kullanin ve dolunayin oturumun zirvesine denk gelmesi icin ofseti ayarlayin. Gelgit takipcisi, faz yuzdesiyle olceklendirilen Mitos etkisini veya psifik hassasiyet zirvelerini temsil edebilir.' },
|
|
117
|
+
{ question: '10 gunluk tahmin nasil calisir?', answer: 'Tahmin, mevcut gunden baslayarak sonraki 10 kampanya gununun her biri icin her aktif ayin ay fazini renkli bir nokta olarak gosterir. Her gun sutununun altindaki yuzde, birlestirilmis gelgit seviyesidir. Yuksek yuzdeye sahip gunler, buyu veya havayla baglantili dramatik karsilasmali gunler icin iyi adaylardir.' },
|
|
118
|
+
{ question: 'Cok kisa donguye sahip bir ayi takip edebilir miyim, ornegin 7 gun?', answer: 'Evet. Yorunge periyodunu 7 olarak ayarlayin. Ay, oyun ici zamanin her haftasinda tam bir donguyu tamamlayarak 8 fazin tamamindan gececektir. Bu, ay buyusunun haftalik olarak sifirlandigi kampanya dunyalari veya duzenli olarak gecen kucuk kuyruklu yildiz benzeri bir cismi takip etmek icin kullanislidir.' },
|
|
119
|
+
{ question: 'Yayinlanmis bir macera modulundeki ay fazini nasil eslestirebilirim?', answer: 'Maceradaki kampanya gunune bakin ve belirtilen fazi not edin. Bunun dongudeki kacinci gune denk geldigini hesaplayin, yorunge periyoduna bolun ve bunu ofset olarak kullanin. Ornegin, 28 gunluk bir dongunun 0. Gununde ilk dordun ayi, ofsetin 7 oldugu anlamina gelir (28\'in dorte biri).' }
|
|
120
|
+
],
|
|
121
|
+
bibliography,
|
|
122
|
+
howTo: [
|
|
123
|
+
{ name: 'Yorunge Periyodunu Ayarlayin', text: 'Ayinizin tam bir donguyu tamamlamasi icin gereken oyun ici gun sayisini girin. Dunyanizin anlatisini kullanin veya 5 ile 60 arasinda bir deger secin.' },
|
|
124
|
+
{ name: 'Baslangic Ofsetini Ayarlayin', text: 'Bir gun ofseti girerek baslangic fazini kaydirin. 0 ofseti Yeni Ay\'da baslatir. Yorunge periyodunun yarisi Dolunay\'da baslatir.' },
|
|
125
|
+
{ name: 'Gun Sayacini Ilerletin', text: 'Adim dugmelerini veya kaydiriciyi kullanarak mevcut kampanya gununuze gidin ve faz ile gelgit seviyesini gercek zamanli olarak okuyun.' }
|
|
126
|
+
],
|
|
127
|
+
schemas: [
|
|
128
|
+
{
|
|
129
|
+
'@context': 'https://schema.org',
|
|
130
|
+
'@type': 'SoftwareApplication',
|
|
131
|
+
'name': 'Masaustu RPG\'ler icin Ay Fazi Hesaplayici: Ozel Fantezi Aylarini ve Gelgit Dongulerini Takip Edin',
|
|
132
|
+
'operatingSystem': 'All',
|
|
133
|
+
'applicationCategory': 'UtilitiesApplication',
|
|
134
|
+
'browserRequirements': 'Requires JavaScript.'
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
'@context': 'https://schema.org',
|
|
138
|
+
'@type': 'FAQPage',
|
|
139
|
+
'mainEntity': [
|
|
140
|
+
{
|
|
141
|
+
'@type': 'Question',
|
|
142
|
+
'name': 'Fantezi dunyam icin hangi yorunge periyodunu kullanmaliyim?',
|
|
143
|
+
'acceptedAnswer': {
|
|
144
|
+
'@type': 'Answer',
|
|
145
|
+
'text': 'Eger evreniniz belirtmiyorsa, tek bir ay icin 28 ila 30 gun idealdir. Birden fazla ay icin, birbirlerinin basit katlari olmayan periyotlar secin ki hizalanmalar cok sik tekrarlanmasin.'
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
'@type': 'Question',
|
|
150
|
+
'name': 'Kabarma Gelgiti oyun terimleriyle ne anlama gelir?',
|
|
151
|
+
'acceptedAnswer': {
|
|
152
|
+
'@type': 'Answer',
|
|
153
|
+
'text': 'Kabarma Gelgiti, tum aktif aylarin ayni hizada cekim yaptigi anlamina gelir. Bunu vahsi buyu dalgalanmalarini tetiklemek, iyilestirme buyusu menzillerini artirmak, firtina siddetini kotulestirmek veya dini gruplar icin kutsal bir gece olarak isaretlemek icin kullanin.'
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
'@type': 'Question',
|
|
158
|
+
'name': 'Iki ayi belirli bir kampanya aninda nasil hizalarim?',
|
|
159
|
+
'acceptedAnswer': {
|
|
160
|
+
'@type': 'Answer',
|
|
161
|
+
'text': 'Her iki ayi da ayni ofset degerine ayarlayin. Iki yorunge periyotlarinin her ortak katinda tekrar hizalanirlar. Onlari sasirtmak icin, ikinci aya yorunge periyodunun yarisina esit bir ofset verin.'
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
'@type': 'Question',
|
|
166
|
+
'name': '10 gunluk tahmin nasil calisir?',
|
|
167
|
+
'acceptedAnswer': {
|
|
168
|
+
'@type': 'Answer',
|
|
169
|
+
'text': 'Tahmin, sonraki 10 kampanya gununun her biri icin her aktif ayin ay fazini renkli bir nokta olarak gosterir. Gosterilen yuzde, birlestirilmis gelgit seviyesidir. Yuksek yuzdeye sahip gunler, dramatik buyu veya hava karsilasmalari icin adaylardir.'
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
'@type': 'Question',
|
|
174
|
+
'name': 'Bunu Call of Cthulhu veya korku kampanyalari icin kullanabilir miyim?',
|
|
175
|
+
'acceptedAnswer': {
|
|
176
|
+
'@type': 'Answer',
|
|
177
|
+
'text': 'Evet. 29 gunluk tek bir ay kullanin ve dolunayin oturumun zirvesine denk gelmesi icin ofseti ayarlayin. Gelgit takipcisi, faz yuzdesiyle olceklendirilen Mitos etkisini veya psifik hassasiyet zirvelerini temsil edebilir.'
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
'@type': 'Question',
|
|
182
|
+
'name': 'Yayinlanmis bir macera modulundeki ay fazini nasil eslestirebilirim?',
|
|
183
|
+
'acceptedAnswer': {
|
|
184
|
+
'@type': 'Answer',
|
|
185
|
+
'text': 'Belirtilen fazi not edin ve bunun dongudeki kacinci gune denk geldigini hesaplayin. Yorunge periyoduna bolun ve bu orani ofset olarak kullanin. Ornegin, 28 gunluk bir dongude ilk dordun ayi, 7 ofseti anlamina gelir.'
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
]
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
'@context': 'https://schema.org',
|
|
192
|
+
'@type': 'HowTo',
|
|
193
|
+
'name': 'Bir Masaustu RPG Kampanyasinda Ay Fazlari Nasil Takip Edilir',
|
|
194
|
+
'step': [
|
|
195
|
+
{
|
|
196
|
+
'@type': 'HowToStep',
|
|
197
|
+
'name': 'Yorunge Periyodunu Ayarlayin',
|
|
198
|
+
'text': 'Ayinizin tam bir donguyu tamamlamasi icin gereken oyun ici gun sayisini girin.'
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
'@type': 'HowToStep',
|
|
202
|
+
'name': 'Baslangic Ofsetini Ayarlayin',
|
|
203
|
+
'text': 'Bir gun ofseti girerek baslangic fazini kaydirin. Yorunge periyodunun yarisi Dolunay\'da baslatir.'
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
'@type': 'HowToStep',
|
|
207
|
+
'name': 'Gun Sayacini Ilerletin',
|
|
208
|
+
'text': 'Adim dugmelerini veya kaydiriciyi kullanarak mevcut kampanya gununuze gidin ve faz ile gelgit seviyesini gorun.'
|
|
209
|
+
}
|
|
210
|
+
]
|
|
211
|
+
}
|
|
212
|
+
]
|
|
213
|
+
};
|
|
214
|
+
export default content;
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
2
|
+
import type { LunarTideLocaleContent } from '../entry';
|
|
3
|
+
|
|
4
|
+
export const content: LunarTideLocaleContent = {
|
|
5
|
+
slug: 'lunar-tide-tracker',
|
|
6
|
+
title: '桌面RPG月相计算器:追踪自定义奇幻月亮与潮汐周期',
|
|
7
|
+
description: '为任意奇幻世界计算具有自定义轨道周期的月相。同时追踪多个月亮,查看十天预报,并获取用于D&D、开拓者或任何RPG中魔法与天气系统的综合潮汐等级。',
|
|
8
|
+
ui: {
|
|
9
|
+
title: '月相与秘法潮汐追踪器',
|
|
10
|
+
moonsTitle: '月亮配置',
|
|
11
|
+
addMoon: '添加自定义月亮',
|
|
12
|
+
removeMoon: '移除月亮',
|
|
13
|
+
moonName: '月亮名称',
|
|
14
|
+
orbitalPeriod: '轨道周期(天)',
|
|
15
|
+
startingOffset: '起始偏移(天)',
|
|
16
|
+
timelineTitle: '时间控制',
|
|
17
|
+
currentDay: '当前战役天数',
|
|
18
|
+
tideTitle: '秘法潮汐状态',
|
|
19
|
+
tideLevel: '潮汐能量等级',
|
|
20
|
+
magicModifier: '魔法潮汐效果',
|
|
21
|
+
forecastTitle: '月相与潮汐预报',
|
|
22
|
+
dayLabel: '天数',
|
|
23
|
+
resetButton: '重置到第0天',
|
|
24
|
+
presetTitle: '战役预设',
|
|
25
|
+
presetSingle: '经典单月亮',
|
|
26
|
+
presetDouble: '魔法双月',
|
|
27
|
+
presetTriple: '三重月食之境',
|
|
28
|
+
newMoon: '新月',
|
|
29
|
+
waxingCrescent: '蛾眉月',
|
|
30
|
+
firstQuarter: '上弦月',
|
|
31
|
+
waxingGibbous: '盈凸月',
|
|
32
|
+
fullMoon: '满月',
|
|
33
|
+
waningGibbous: '亏凸月',
|
|
34
|
+
lastQuarter: '下弦月',
|
|
35
|
+
waningCrescent: '残月',
|
|
36
|
+
},
|
|
37
|
+
seo: [
|
|
38
|
+
{ type: 'title', text: '如何在奇幻RPG战役中追踪月相', level: 2 },
|
|
39
|
+
{ type: 'paragraph', html: '大多数奇幻设定的月亮轨道周期与现实中29.5天的月球周期不同。<strong>轨道周期</strong>字段设定一个月亮完成一次完整周期需要多少游戏内天数。地球的月亮需要29天;艾伯伦设定中使用28天;托尔金的中土世界月亮周期接近30天。根据你的世界设定填写此值,或在5至60天之间选择任意能产生你期望的月食频率的数字。' },
|
|
40
|
+
{
|
|
41
|
+
type: 'stats',
|
|
42
|
+
items: [
|
|
43
|
+
{ value: '3', label: '同时追踪月亮数' },
|
|
44
|
+
{ value: '10', label: '预报天数' },
|
|
45
|
+
{ value: '5', label: '潮汐状态(小潮至大潮)' }
|
|
46
|
+
],
|
|
47
|
+
columns: 3
|
|
48
|
+
},
|
|
49
|
+
{ type: 'title', text: '理解起始偏移字段', level: 2 },
|
|
50
|
+
{ type: 'paragraph', html: '<strong>起始偏移</strong>决定月亮在战役第0天所处的周期位置。偏移为0意味着月亮从新月开始。偏移等于轨道周期的一半则使其从满月开始。用此字段匹配你战役开场场景中描述的月相,或确保两个月亮从不同位置开始,避免它们总是对齐。' },
|
|
51
|
+
{ type: 'title', text: '潮汐等级对游戏的意义', level: 2 },
|
|
52
|
+
{ type: 'paragraph', html: '潮汐等级根据所有活跃月亮当前月相的综合引力计算。<strong>大潮</strong>(75%以上)发生在多个月亮接近满月或新月对齐时,向同一方向施力。<strong>小潮</strong>(30%以下)发生在月亮处于相对相位时,部分力量相互抵消。你可以将其直接与任何游戏机制挂钩:法术豁免DC加值、德鲁伊野性变身持续时间、狼人变形阈值,或沿海地图上的风暴强度。' },
|
|
53
|
+
{
|
|
54
|
+
type: 'comparative',
|
|
55
|
+
items: [
|
|
56
|
+
{
|
|
57
|
+
title: '单月亮',
|
|
58
|
+
description: '最适合贴近现实世界或只有一个主要月亮的设定。简单的八相位周期,无需参考即可轻松掌握。',
|
|
59
|
+
icon: 'mdi:moon-full',
|
|
60
|
+
highlight: false,
|
|
61
|
+
points: [
|
|
62
|
+
'适用于D&D被遗忘的国度(苏伦,30天)',
|
|
63
|
+
'狼人与兽化人战役',
|
|
64
|
+
'与满月相关的恐怖团'
|
|
65
|
+
]
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
title: '双月亮',
|
|
69
|
+
description: '常见于高奇幻设定。产生频繁的部分对齐和有趣的中周期潮汐。对齐大约每LCM(周期1, 周期2)天发生一次。',
|
|
70
|
+
icon: 'mdi:moon-waxing-crescent',
|
|
71
|
+
highlight: true,
|
|
72
|
+
points: [
|
|
73
|
+
'艾伯伦(Rhaan 28天 + Aryth 12天)',
|
|
74
|
+
'创造可预测的月食季节',
|
|
75
|
+
'适用于德鲁伊或元素魔法体系'
|
|
76
|
+
]
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
title: '三月亮',
|
|
80
|
+
description: '罕见的三重对齐产生不可预测的潮汐涌流。没有此工具将难以预测综合潮汐,而这正是其戏剧性价值所在。',
|
|
81
|
+
icon: 'mdi:moon-waning-crescent',
|
|
82
|
+
highlight: false,
|
|
83
|
+
points: [
|
|
84
|
+
'对齐时触发狂野魔法波动表',
|
|
85
|
+
'开拓者格拉利昂式的复杂性',
|
|
86
|
+
'适用于史诗战役的长周期循环'
|
|
87
|
+
]
|
|
88
|
+
}
|
|
89
|
+
],
|
|
90
|
+
columns: 3
|
|
91
|
+
},
|
|
92
|
+
{ type: 'title', text: '奇幻世界的常见轨道周期', level: 3 },
|
|
93
|
+
{
|
|
94
|
+
type: 'glossary',
|
|
95
|
+
items: [
|
|
96
|
+
{ term: '苏伦(被遗忘的国度)', definition: '30天轨道周期,单月亮。偏移设为15可在第一次团时从满月开始。' },
|
|
97
|
+
{ term: '艾伯伦月亮', definition: '艾伯伦有12个月亮,周期从9天到28天。将每个作为独立的月亮实例运行,或挑选两个与剧情最相关的。' },
|
|
98
|
+
{ term: '格拉利昂(开拓者)', definition: '格拉利昂有单个月亮索马尔,周期29天。暗幕事件可以通过设置一个具有偏移干扰的短周期副月亮来模拟。' },
|
|
99
|
+
{ term: '自定义世界', definition: '15天周期的月亮每年产生24次满月。45天周期的月亮大约产生8次。周期越短意味着月食事件越频繁,但会降低其叙事分量。' }
|
|
100
|
+
]
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
type: 'diagnostic',
|
|
104
|
+
variant: 'info',
|
|
105
|
+
title: '提示:为第一次团设置特定月相',
|
|
106
|
+
icon: 'mdi:information-outline',
|
|
107
|
+
badge: '设置技巧',
|
|
108
|
+
html: '如果你的战役从弯月开始,将偏移设为轨道周期的约20%。若要满月开始,使用周期的50%作为偏移。例如,28天周期月亮从满月开始应使用偏移14。将天数计数器推进到当前战役天数,预报将自动显示接下来10天。'
|
|
109
|
+
}
|
|
110
|
+
],
|
|
111
|
+
faq: [
|
|
112
|
+
{ question: '我的奇幻世界应该使用多长的轨道周期?', answer: '如果你的设定未指定,28到30天适合单个月亮。对于多个月亮,选择彼此不成简单倍数的周期(例如20和27),这样对齐不会过于频繁。较短的周期(10到15天)适用于产生频繁小潮的副月亮。' },
|
|
113
|
+
{ question: '如何让两个月亮在特定战役时刻对齐?', answer: '将两个月亮设为相同的偏移值。它们将在第0天处于相同相位,并在两个周期的最小公倍数那天再次对齐。若要错开它们,给第二个月亮一个等于其轨道周期一半的偏移,使它们从相对位置开始。' },
|
|
114
|
+
{ question: '大潮在游戏术语中意味着什么?', answer: '大潮意味着所有活跃月亮处于对齐状态,产生最大潮汐能量。你可以用它触发狂野魔法波动、提升治疗法术范围、加剧风暴强度,或将其标记为世界中某个宗教派系的神圣之夜。' },
|
|
115
|
+
{ question: '小潮在游戏术语中意味着什么?', answer: '小潮发生在月亮部分相互抵消时。这是反魔法效果、海上风平浪静、或反派执行需要稳定魔法压制的计划的好时机。' },
|
|
116
|
+
{ question: '我能将其用于克苏鲁的呼唤或恐怖战役吗?', answer: '可以。使用单个月亮设置29天周期,偏移设为让满月落在团的高潮时刻。潮汐追踪器可以代表随着月相百分比变化而增强的克苏鲁神话影响力或精神敏感度峰值。' },
|
|
117
|
+
{ question: '十天预报是如何工作的?', answer: '预报将每个活跃月亮的月相以彩色圆点形式显示在接下来10个战役天中,从当前天开始。每天下方的百分比是综合潮汐等级。高百分比天数是与魔法或天气相关的戏剧性遭遇的好选择。' },
|
|
118
|
+
{ question: '我能追踪周期非常短的月亮吗,比如7天?', answer: '可以。将轨道周期设为7。月亮将每游戏内周完成一次完整周期,经历所有8个相位。适用于魔法每周重置的战役世界,或追踪一个定期经过的小型彗星天体。' },
|
|
119
|
+
{ question: '如何匹配已出版冒险模组中的月相?', answer: '查找冒险中的战役天数并记录描述的月相。计算该月相对应在周期中的第几天,除以轨道周期,将该值作为偏移。例如,28天周期第0天是上弦月,意味着偏移为7(28的四分之一)。' }
|
|
120
|
+
],
|
|
121
|
+
bibliography,
|
|
122
|
+
howTo: [
|
|
123
|
+
{ name: '设置轨道周期', text: '输入你的月亮完成一次完整周期所需的游戏内天数。参考你的世界设定,或在5到60之间选择一个值。' },
|
|
124
|
+
{ name: '设置起始偏移', text: '输入天数偏移来调整起始月相。偏移0从新月开始。轨道周期的一半从满月开始。' },
|
|
125
|
+
{ name: '推进天数计数器', text: '使用步进按钮或滑块移动到当前战役天数,实时查看月相和潮汐等级。' }
|
|
126
|
+
],
|
|
127
|
+
schemas: [
|
|
128
|
+
{
|
|
129
|
+
'@context': 'https://schema.org',
|
|
130
|
+
'@type': 'SoftwareApplication',
|
|
131
|
+
'name': '桌面RPG月相计算器:追踪自定义奇幻月亮与潮汐周期',
|
|
132
|
+
'operatingSystem': 'All',
|
|
133
|
+
'applicationCategory': 'UtilitiesApplication',
|
|
134
|
+
'browserRequirements': '需要JavaScript。'
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
'@context': 'https://schema.org',
|
|
138
|
+
'@type': 'FAQPage',
|
|
139
|
+
'mainEntity': [
|
|
140
|
+
{
|
|
141
|
+
'@type': 'Question',
|
|
142
|
+
'name': '我的奇幻世界应该使用多长的轨道周期?',
|
|
143
|
+
'acceptedAnswer': {
|
|
144
|
+
'@type': 'Answer',
|
|
145
|
+
'text': '如果你的设定未指定,28到30天适合单个月亮。对于多个月亮,选择彼此不成简单倍数的周期,这样对齐不会过于频繁。'
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
'@type': 'Question',
|
|
150
|
+
'name': '大潮在游戏术语中意味着什么?',
|
|
151
|
+
'acceptedAnswer': {
|
|
152
|
+
'@type': 'Answer',
|
|
153
|
+
'text': '大潮意味着所有活跃月亮处于对齐状态。用它触发狂野魔法波动、提升治疗法术范围、加剧风暴强度,或将其标记为宗教派系的神圣之夜。'
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
'@type': 'Question',
|
|
158
|
+
'name': '如何让两个月亮在特定战役时刻对齐?',
|
|
159
|
+
'acceptedAnswer': {
|
|
160
|
+
'@type': 'Answer',
|
|
161
|
+
'text': '将两个月亮设为相同的偏移值。它们将在两个轨道周期的最小公倍数那天再次对齐。若要错开它们,给第二个月亮一个等于其轨道周期一半的偏移。'
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
'@type': 'Question',
|
|
166
|
+
'name': '十天预报是如何工作的?',
|
|
167
|
+
'acceptedAnswer': {
|
|
168
|
+
'@type': 'Answer',
|
|
169
|
+
'text': '预报将每个活跃月亮的月相以彩色圆点形式显示在接下来10个战役天中。显示的百分比是综合潮汐等级。高百分比天数是魔法或天气戏剧性遭遇的好选择。'
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
'@type': 'Question',
|
|
174
|
+
'name': '我能将其用于克苏鲁的呼唤或恐怖战役吗?',
|
|
175
|
+
'acceptedAnswer': {
|
|
176
|
+
'@type': 'Answer',
|
|
177
|
+
'text': '可以。使用单个月亮设置29天周期,偏移设为让满月落在团的高潮时刻。潮汐追踪器可以代表随着月相百分比变化而增强的克苏鲁神话影响力或精神敏感度峰值。'
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
'@type': 'Question',
|
|
182
|
+
'name': '如何匹配已出版冒险模组中的月相?',
|
|
183
|
+
'acceptedAnswer': {
|
|
184
|
+
'@type': 'Answer',
|
|
185
|
+
'text': '记录描述的月相并计算该月相对应在周期中的第几天。除以轨道周期,将该比值作为偏移。例如,28天周期上弦月意味着偏移为7。'
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
]
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
'@context': 'https://schema.org',
|
|
192
|
+
'@type': 'HowTo',
|
|
193
|
+
'name': '如何在桌面角色扮演游戏战役中追踪月相',
|
|
194
|
+
'step': [
|
|
195
|
+
{
|
|
196
|
+
'@type': 'HowToStep',
|
|
197
|
+
'name': '设置轨道周期',
|
|
198
|
+
'text': '输入你的月亮完成一次完整周期所需的游戏内天数。'
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
'@type': 'HowToStep',
|
|
202
|
+
'name': '设置起始偏移',
|
|
203
|
+
'text': '输入天数偏移来调整起始月相。轨道周期的一半从满月开始。'
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
'@type': 'HowToStep',
|
|
207
|
+
'name': '推进天数计数器',
|
|
208
|
+
'text': '使用步进按钮或滑块移动到当前战役天数,查看月相和潮汐等级。'
|
|
209
|
+
}
|
|
210
|
+
]
|
|
211
|
+
}
|
|
212
|
+
]
|
|
213
|
+
};
|
|
214
|
+
export default content;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ToolDefinition } from '../../types';
|
|
2
|
+
import { lunarTideTracker } from './entry';
|
|
3
|
+
export * from './entry';
|
|
4
|
+
export const LUNAR_TIDE_TRACKER_TOOL: ToolDefinition = {
|
|
5
|
+
entry: lunarTideTracker,
|
|
6
|
+
Component: () => import('./component.astro'),
|
|
7
|
+
SEOComponent: () => import('./seo.astro'),
|
|
8
|
+
BibliographyComponent: () => import('./bibliography.astro'),
|
|
9
|
+
};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { calculateMoonPhase, calculateCombinedTide, generateForecast } from './logic';
|
|
3
|
+
import type { Moon } from './types';
|
|
4
|
+
|
|
5
|
+
describe('Lunar Phase Logic', () => {
|
|
6
|
+
it('calculates phases correctly for standard moon', () => {
|
|
7
|
+
const period = 28;
|
|
8
|
+
const offset = 0;
|
|
9
|
+
|
|
10
|
+
expect(calculateMoonPhase(0, period, offset).phase).toBe('new');
|
|
11
|
+
expect(calculateMoonPhase(7, period, offset).phase).toBe('first_quarter');
|
|
12
|
+
expect(calculateMoonPhase(14, period, offset).phase).toBe('full');
|
|
13
|
+
expect(calculateMoonPhase(21, period, offset).phase).toBe('last_quarter');
|
|
14
|
+
expect(calculateMoonPhase(28, period, offset).phase).toBe('new');
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('handles offsets and negative days properly', () => {
|
|
18
|
+
const period = 30;
|
|
19
|
+
const offset = 15;
|
|
20
|
+
|
|
21
|
+
expect(calculateMoonPhase(0, period, offset).phase).toBe('full');
|
|
22
|
+
expect(calculateMoonPhase(-15, period, offset).phase).toBe('new');
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
describe('Combined Tide Logic', () => {
|
|
27
|
+
const moons: Moon[] = [
|
|
28
|
+
{ id: '1', name: 'Solaria', period: 20, offset: 0, color: '#ffcc00' },
|
|
29
|
+
{ id: '2', name: 'Lunaria', period: 30, offset: 15, color: '#00ccff' }
|
|
30
|
+
];
|
|
31
|
+
|
|
32
|
+
it('determines intensity and labelKey for empty moons', () => {
|
|
33
|
+
const res = calculateCombinedTide(10, []);
|
|
34
|
+
expect(res.intensity).toBe(50);
|
|
35
|
+
expect(res.labelKey).toBe('normal');
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('calculates average impact of combined gravitational pull', () => {
|
|
39
|
+
const res = calculateCombinedTide(0, moons);
|
|
40
|
+
expect(res.intensity).toBeGreaterThanOrEqual(0);
|
|
41
|
+
expect(res.intensity).toBeLessThanOrEqual(100);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
describe('Forecast Generation', () => {
|
|
46
|
+
const moons: Moon[] = [
|
|
47
|
+
{ id: '1', name: 'Luna', period: 28, offset: 0, color: '#ffffff' }
|
|
48
|
+
];
|
|
49
|
+
|
|
50
|
+
it('creates the requested number of forecast items', () => {
|
|
51
|
+
const items = generateForecast(0, 10, moons);
|
|
52
|
+
expect(items.length).toBe(10);
|
|
53
|
+
expect(items[0]!.day).toBe(0);
|
|
54
|
+
expect(items[9]!.day).toBe(9);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { Moon, MoonPhaseType, MoonPhaseInfo, ForecastItem } from './types';
|
|
2
|
+
|
|
3
|
+
export function calculateMoonPhase(day: number, period: number, offset: number): MoonPhaseInfo {
|
|
4
|
+
const adjustedDay = ((day + offset) % period + period) % period;
|
|
5
|
+
const percentage = adjustedDay / period;
|
|
6
|
+
const angle = percentage * 360;
|
|
7
|
+
|
|
8
|
+
const phases: MoonPhaseType[] = [
|
|
9
|
+
'new',
|
|
10
|
+
'waxing_crescent',
|
|
11
|
+
'first_quarter',
|
|
12
|
+
'waxing_gibbous',
|
|
13
|
+
'full',
|
|
14
|
+
'waning_gibbous',
|
|
15
|
+
'last_quarter',
|
|
16
|
+
'waning_crescent'
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
const index = Math.floor(((percentage + 0.0625) % 1) * 8);
|
|
20
|
+
const phase = phases[index] || 'new';
|
|
21
|
+
|
|
22
|
+
return { phase, percentage, angle };
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function calculateCombinedTide(day: number, moons: Moon[]): { intensity: number; labelKey: string } {
|
|
26
|
+
if (moons.length === 0) {
|
|
27
|
+
return { intensity: 50, labelKey: 'normal' };
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
let totalImpact = 0;
|
|
31
|
+
for (const moon of moons) {
|
|
32
|
+
const { percentage } = calculateMoonPhase(day, moon.period, moon.offset);
|
|
33
|
+
const impact = Math.abs(Math.cos(2 * Math.PI * percentage));
|
|
34
|
+
totalImpact += impact;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const averageImpact = totalImpact / moons.length;
|
|
38
|
+
const intensity = Math.round(averageImpact * 100);
|
|
39
|
+
|
|
40
|
+
let labelKey = 'normal';
|
|
41
|
+
if (intensity < 30) {
|
|
42
|
+
labelKey = 'neap';
|
|
43
|
+
} else if (intensity >= 30 && intensity < 50) {
|
|
44
|
+
labelKey = 'low';
|
|
45
|
+
} else if (intensity >= 50 && intensity < 75) {
|
|
46
|
+
labelKey = 'high';
|
|
47
|
+
} else {
|
|
48
|
+
labelKey = 'spring';
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return { intensity, labelKey };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function generateForecast(startDay: number, count: number, moons: Moon[]): ForecastItem[] {
|
|
55
|
+
const items: ForecastItem[] = [];
|
|
56
|
+
for (let i = 0; i < count; i++) {
|
|
57
|
+
const day = startDay + i;
|
|
58
|
+
const moonPhases = moons.map((m) => {
|
|
59
|
+
const info = calculateMoonPhase(day, m.period, m.offset);
|
|
60
|
+
return {
|
|
61
|
+
moonId: m.id,
|
|
62
|
+
phase: info.phase,
|
|
63
|
+
percentage: info.percentage,
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
const tide = calculateCombinedTide(day, moons);
|
|
68
|
+
items.push({
|
|
69
|
+
day,
|
|
70
|
+
moons: moonPhases,
|
|
71
|
+
tideLevel: tide.intensity,
|
|
72
|
+
tideName: tide.labelKey,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return items;
|
|
76
|
+
}
|