sorcery  calendar.lua at [3f6a913e4e]

File calendar.lua artifact f67589c567 part of check-in 3f6a913e4e


if not sorcery then
	sorcery = { data = {
		calendar = dofile('data/calendar.lua');
		signs = dofile('data/signs.lua');
	} }
end

sorcery.calendar = {}

sorcery.calendar.stats = function(style)
	if not style then style = sorcery.data.calendar.default end
	local s = sorcery.data.calendar.styles[style]
	local days, moons, weeks = s.days, s.moons, s.weeks

	return {
		days_in_year = #moons * #weeks * #days;
		days_in_week = #days;
		days_in_moon = #days * #weeks;
		weeks_in_moon = #weeks;
		weeks_in_year = #weeks * #moons;
		moons_in_year = #moons;
	}
end

sorcery.calendar.date = function(day,style)
	local s = sorcery.calendar.stats(style)

	local day_of_year = day % s.days_in_year;
	local day_of_moon = day_of_year % s.days_in_moon;
	local day_of_week = day_of_moon % s.days_in_week;

	return {
		day_of_year = 1 + day_of_year;
		day_of_moon = 1 + day_of_moon;
		day_of_week = 1 + day_of_week;
		week_of_moon = 1 + math.floor(day_of_moon / s.days_in_week);
		week_of_year = 1 + math.floor(day_of_year / s.days_in_week);
		moon_of_year = 1 + math.floor(day_of_year / s.days_in_moon);
		year = math.floor(day / s.days_in_year);
		moons_passed = math.floor(day / s.days_in_moon);
		weeks_passed = math.floor(day / s.days_in_week);
	}
end

sorcery.calendar.stars = function(day,style)
	local periods = math.floor(day / sorcery.data.calendar.days_per_stellar_cycle)

	local elapsed = 0
	local cycle = 1
	while true do
		for _, c in pairs(sorcery.data.signs) do
			if c.cycle then
				if cycle % c.cycle ~= 0 then goto skip end
			end
			elapsed = elapsed + c.duration
			if elapsed >= periods then
				return {
					sign = c;
					cycle = cycle;
				}
			end
		::skip::end
		cycle = cycle + 1
	end
end

sorcery.calendar.longdate = function(day)
	if not style then style = sorcery.data.calendar.default end
	return sorcery.data.calendar.styles[style].longdate(sorcery.calendar.date(day))
end

sorcery.calendar.shortdate = function(day,style)
	if not style then style = sorcery.data.calendar.default end
	return sorcery.data.calendar.styles[style].shortdate(sorcery.calendar.date(day))
end

sorcery.calendar.stardate = function(day)
	local s = sorcery.calendar.stars(day)
	return string.format('sign of the %s, stellar cycle %u', s.sign.patron, s.cycle)
end

-- math.randomseed(os.time())
-- local d = math.random(500,256000)
-- print(string.format('%s :: %s in the %s',
-- 	sorcery.calendar.shortdate(d),
-- 	sorcery.calendar.longdate(d),
-- 	sorcery.calendar.stardate(d)))