2025-06-17 00:35:04 -04:00
|
|
|
|
export enum TzolkinName {
|
2025-06-23 20:29:26 -04:00
|
|
|
|
IMIX,
|
|
|
|
|
IK,
|
|
|
|
|
AKBAL,
|
|
|
|
|
KAN,
|
|
|
|
|
CHIKCHAN,
|
|
|
|
|
KIMI,
|
|
|
|
|
MANIK,
|
|
|
|
|
LAMAT,
|
|
|
|
|
MULUK,
|
|
|
|
|
OK,
|
|
|
|
|
CHUWEN,
|
|
|
|
|
EB,
|
|
|
|
|
BEN,
|
|
|
|
|
IX,
|
|
|
|
|
MEN,
|
|
|
|
|
KIB,
|
|
|
|
|
KABAN,
|
|
|
|
|
ETZNAB,
|
|
|
|
|
KAWAK,
|
|
|
|
|
AJAW
|
2025-06-17 00:35:04 -04:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export type TzolkinNumber = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13;
|
|
|
|
|
|
|
|
|
|
export type Tzolkin = {
|
2025-06-23 20:29:26 -04:00
|
|
|
|
number: TzolkinNumber,
|
|
|
|
|
name: TzolkinName,
|
2025-06-17 00:35:04 -04:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const tzolkinNames: Record<TzolkinName, string> = {
|
2025-06-23 20:29:26 -04:00
|
|
|
|
[TzolkinName.IMIX]: 'Imix',
|
|
|
|
|
[TzolkinName.IK]: 'Ikʼ',
|
|
|
|
|
[TzolkinName.AKBAL]: 'Akʼbʼal',
|
|
|
|
|
[TzolkinName.KAN]: 'Kʼan',
|
|
|
|
|
[TzolkinName.CHIKCHAN]: 'Chikchan',
|
|
|
|
|
[TzolkinName.KIMI]: 'Kimi',
|
|
|
|
|
[TzolkinName.MANIK]: 'Manikʼ',
|
|
|
|
|
[TzolkinName.LAMAT]: 'Lamat',
|
|
|
|
|
[TzolkinName.MULUK]: 'Muluk',
|
|
|
|
|
[TzolkinName.OK]: 'Ok',
|
|
|
|
|
[TzolkinName.CHUWEN]: 'Chuwen',
|
|
|
|
|
[TzolkinName.EB]: 'Ebʼ',
|
|
|
|
|
[TzolkinName.BEN]: 'Bʼen',
|
|
|
|
|
[TzolkinName.IX]: 'Ix',
|
|
|
|
|
[TzolkinName.MEN]: 'Men',
|
|
|
|
|
[TzolkinName.KIB]: 'Kibʼ',
|
|
|
|
|
[TzolkinName.KABAN]: 'Kabʼan',
|
|
|
|
|
[TzolkinName.ETZNAB]: 'Etzʼnabʼ',
|
|
|
|
|
[TzolkinName.KAWAK]: 'Kawak',
|
|
|
|
|
[TzolkinName.AJAW]: 'Ajaw',
|
2025-06-17 00:35:04 -04:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export function tzolkinName(name: TzolkinName): string {
|
2025-06-23 20:29:26 -04:00
|
|
|
|
return tzolkinNames[name];
|
2025-06-17 00:35:04 -04:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function formatTzolkin(tzolkin: Tzolkin): string {
|
2025-06-23 20:29:26 -04:00
|
|
|
|
return `${tzolkin.number} ${tzolkinName(tzolkin.name)}`;
|
2025-06-17 00:35:04 -04:00
|
|
|
|
}
|
2025-06-17 22:04:14 -04:00
|
|
|
|
|
|
|
|
|
export function jdnTzolkin(jdn: number): Tzolkin {
|
2025-06-23 20:29:26 -04:00
|
|
|
|
return {
|
|
|
|
|
number: ((jdn % 13 + 18) % 13 + 1) as TzolkinNumber,
|
|
|
|
|
name: (jdn % 20 + 36) % 20,
|
|
|
|
|
};
|
2025-06-17 22:04:14 -04:00
|
|
|
|
}
|
2025-06-22 04:28:56 -04:00
|
|
|
|
|
|
|
|
|
export type HaabMonth = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19;
|
|
|
|
|
export type HaabDay = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19;
|
|
|
|
|
|
2025-06-24 23:12:11 -04:00
|
|
|
|
export type Haab = {
|
|
|
|
|
month: HaabMonth,
|
|
|
|
|
day: HaabDay,
|
|
|
|
|
};
|
|
|
|
|
|
2025-07-13 15:28:39 -04:00
|
|
|
|
export const haabNames: Record<HaabMonth, string> = {
|
2025-06-23 20:29:26 -04:00
|
|
|
|
1: 'Pop',
|
|
|
|
|
2: 'Woʼ',
|
|
|
|
|
3: 'Sip',
|
|
|
|
|
4: 'Sotzʼ',
|
|
|
|
|
5: 'Sek',
|
|
|
|
|
6: 'Xul',
|
|
|
|
|
7: 'Yaxkʼin',
|
|
|
|
|
8: 'Mol',
|
|
|
|
|
9: 'Chʼen',
|
|
|
|
|
10: 'Yax',
|
|
|
|
|
11: 'Sakʼ',
|
|
|
|
|
12: 'Keh',
|
|
|
|
|
13: 'Mak',
|
|
|
|
|
14: 'Kʼankʼin',
|
|
|
|
|
15: 'Muwan',
|
|
|
|
|
16: 'Pax',
|
|
|
|
|
17: 'Kʼayabʼ',
|
|
|
|
|
18: 'Kumkʼu',
|
|
|
|
|
19: 'Wayebʼ',
|
2025-06-22 04:28:56 -04:00
|
|
|
|
};
|
|
|
|
|
|
2025-06-27 22:25:46 -04:00
|
|
|
|
export function formatHaab({month, day}: Haab): string {
|
2025-06-23 20:29:26 -04:00
|
|
|
|
return `${day} ${haabNames[month]}`;
|
2025-06-22 04:28:56 -04:00
|
|
|
|
}
|
2025-06-24 23:12:11 -04:00
|
|
|
|
|
|
|
|
|
export function jdnHaab(jdn: number): Haab {
|
|
|
|
|
const yearDay = (jdn % 365 + 430) % 365;
|
|
|
|
|
return {
|
|
|
|
|
month: (Math.floor(yearDay / 20) + 1) as HaabMonth,
|
|
|
|
|
day: yearDay % 20 as HaabDay,
|
|
|
|
|
};
|
|
|
|
|
}
|
2025-06-30 01:32:20 -04:00
|
|
|
|
|
2025-07-12 19:57:00 -04:00
|
|
|
|
export function haabMonthDays(month: HaabMonth): number {
|
|
|
|
|
return month === 19 ? 5 : 20;
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-12 19:52:57 -04:00
|
|
|
|
export type HaabYear = number;
|
|
|
|
|
|
2025-07-11 00:31:33 -04:00
|
|
|
|
export type HaabExt = Haab & {
|
2025-07-12 19:52:57 -04:00
|
|
|
|
year: HaabYear,
|
2025-07-11 00:31:33 -04:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export function jdnHaabExt(jdn: number): HaabExt {
|
|
|
|
|
return {
|
|
|
|
|
...jdnHaab(jdn),
|
|
|
|
|
year: Math.floor((jdn - 583935) / 365),
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-13 04:30:03 -04:00
|
|
|
|
export function haabExtJDN({year, month, day}: HaabExt): number {
|
|
|
|
|
return 583935 + 365 * year + (month - 1) * 20 + day;
|
|
|
|
|
}
|
|
|
|
|
|
2025-06-30 01:32:20 -04:00
|
|
|
|
export type LordOfNight = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
|
|
|
|
|
|
|
|
|
|
export function formatLordOfNight(lordOfNight: LordOfNight): string {
|
|
|
|
|
return `G${lordOfNight}`;
|
|
|
|
|
}
|
2025-07-08 22:29:05 -04:00
|
|
|
|
|
|
|
|
|
export function jdnLordOfNight(jdn: number): LordOfNight {
|
|
|
|
|
return (jdn % 9 + 15) % 9 + 1 as LordOfNight;
|
|
|
|
|
}
|