diff --git a/events.js b/events.js index 340427e..607cace 100644 --- a/events.js +++ b/events.js @@ -1,14 +1,22 @@ // Configuration of periodic events in CoBiE time -// Each event repeats every cosmocycle. -// "cobie" is the timestamp within the cosmocycle when the event occurs. -// "tag" is a short label that will be displayed on the calendar. +// Each object describes when the event occurs and how often it repeats. +// +// Fields: +// start - CoBiE timestamp when the first occurrence happens. +// end - optional CoBiE timestamp after which the event stops. +// unit - the unit of the recurrence ("second", "xenocycle", "quantic", +// "chronon", "eonstrip", "megasequence", "cosmocycle", ...). +// interval - how many units between occurrences (1 = every unit, +// 2 = every second unit, ...). +// label - short description displayed on the calendar. +// duration - optional length of the event in seconds. window.SPECIAL_EVENTS = [ - { cobie: '49f4.9332', label: 'Afina', megasequence: 'Mythran Epoch', eonstrip: 'Ventaso' }, - { cobie: '11e5.f552', label: 'Oleks', megasequence: 'Umbral Echo', eonstrip: 'Ignisar' }, - { cobie: '4d07.a2b2', label: 'Vincent', megasequence: 'Azurean Tide', eonstrip: 'Floraen' }, - { cobie: '3edc.d430', label: 'Hochzeitstag', megasequence: 'Lustran Bounty', eonstrip: 'Electros' }, - { cobie: '330d.d4ae', label: 'Zusammentag', megasequence: 'Azurean Tide', eonstrip: 'Chronar' }, - { cobie: '11de.0c52', label: 'Anna', megasequence: 'Lustran Bounty', eonstrip: 'Radiantae' }, - { cobie: '467f.ae61', label: 'Iris', megasequence: 'Argent Veil', eonstrip: 'Etherion' } + { start: '49f4.9332', label: 'Afina', unit: 'cosmocycle', interval: 1 }, + { start: '11e5.f552', label: 'Oleks', unit: 'cosmocycle', interval: 1 }, + { start: '4d07.a2b2', label: 'Vincent', unit: 'cosmocycle', interval: 1 }, + { start: '3edc.d430', label: 'Hochzeitstag', unit: 'cosmocycle', interval: 1 }, + { start: '330d.d4ae', label: 'Zusammentag', unit: 'cosmocycle', interval: 1 }, + { start: '11de.0c52', label: 'Anna', unit: 'cosmocycle', interval: 1 }, + { start: '467f.ae61', label: 'Iris', unit: 'cosmocycle', interval: 1 } ]; diff --git a/script.js b/script.js index 9c5fdde..9d52079 100644 --- a/script.js +++ b/script.js @@ -613,13 +613,32 @@ function updateCalendar() { `; if (Array.isArray(window.SPECIAL_EVENTS)) { - const offsetStart = ((cellCob % COBIE_UNITS.cosmocycle) + COBIE_UNITS.cosmocycle) % COBIE_UNITS.cosmocycle; - const offsetEnd = offsetStart + COBIE_UNITS.eonstrip; + const cellStart = cellCob; + const cellEnd = cellCob + COBIE_UNITS.eonstrip; window.SPECIAL_EVENTS.forEach(ev => { - const evCob = parseCobiets(ev.cobie); - if (evCob === null) return; - const evOffset = ((evCob % COBIE_UNITS.cosmocycle) + COBIE_UNITS.cosmocycle) % COBIE_UNITS.cosmocycle; - if (evOffset >= offsetStart && evOffset < offsetEnd) { + const startCob = parseCobiets(ev.start || ev.cobie); + if (startCob === null) return; + const endCob = ev.end ? parseCobiets(ev.end) : Number.POSITIVE_INFINITY; + const unitVal = COBIE_UNITS[ev.unit] || COBIE_UNITS.cosmocycle; + const interval = (ev.interval || 1) * unitVal; + let duration = 0; + if (typeof ev.duration === 'string') { + const d = parseCobiets(ev.duration); + if (d !== null) duration = d; + } else if (typeof ev.duration === 'number') { + duration = ev.duration; + } + + if (cellStart > endCob) return; + + let n = Math.floor((cellStart - startCob) / interval); + if (n < 0) n = 0; + let occ = startCob + n * interval; + if (occ + duration <= cellStart) { + occ += interval; + } + + if (occ < cellEnd && occ + duration > cellStart && occ <= endCob) { const tag = document.createElement('div'); tag.className = 'event-tag'; tag.textContent = ev.label;