calendar = {} local S if minetest.get_translator then S = minetest.get_translator("calendar") else S = function(s) return s end end local F = minetest.formspec_escape calendar.MONTH_DAYS = 30 -- Long month names calendar.month_names = { S('January'), S('February'), S('March'), S('April'), S('May'), S('June'), S('July'), S('August'), S('September'), S('October'), S('November'), S('December') } --calendar.month_names = { S('Spring'), S('Summer'), S('Harvest'), S('Winter') } -- Short month names calendar.month_names_short = { S('Jan'), S('Feb'), S('Mar'), S('Apr'), S('May'), S('Jun'), S('Jul'), S('Aug'), S('Sep'), S('Oct'), S('Nov'), S('Dec') } --calendar.month_names_short = { S('Spr'), S('Sum'), S('Har'), S('Win') } calendar.MONTHS = #calendar.month_names calendar.YEAR_DAYS = calendar.MONTHS * calendar.MONTH_DAYS -- Week day names calendar.weekday_names = { S("Monday"), S("Tuesday"), S("Wednesday"), S("Thursday"), S("Friday"), S("Saturday"), S("Sunday") } calendar.weekday_names_short = { S("Mo"), S("Tu"), S("We"), S("Th"), S("Fr"), S("Sa"), S("Su") } calendar.WEEK_DAYS = #calendar.weekday_names calendar.FIRST_WEEK_DAY = 0 local holidays = {} -- Register a holiday. -- def: Table with these fields: -- * name: Human-readable name -- * days: Cardinal month day on which the holiday occurs -- * months: Cardinal month on which the holiday occurs calendar.register_holiday = function(def) table.insert(holidays, def) end calendar.register_holiday({ name = S("New Year's Eve"), days = 0, months = 0 }) calendar.get_holidays = function(total_days) local days, months, years = calendar.get_date(total_days) local found_holidays = {} for h=1, #holidays do local holiday = holidays[h] if holiday.days == days and holiday.months == months then table.insert(found_holidays, holiday) end end return found_holidays end -- Returny weekday number -- * total_days: elapsed days since start of world calendar.get_weekday = function(total_days) return (total_days + calendar.FIRST_WEEK_DAY) % calendar.WEEK_DAYS end -- Returns day, month, year, days in year -- * days: elapsed days since start of world -- * ordinal: if true, use ordinal numbers (day, month, year start counting at 1). -- if false, use cardinal numbers (day, month, year start counting at 0). -- default: false calendar.get_date = function(days, ordinal) if not days then days = minetest.get_day_count() end local y = math.floor( days / calendar.YEAR_DAYS ) -- elapsed years in epoch local m = math.floor( days % calendar.YEAR_DAYS / calendar.MONTH_DAYS ) -- elapsed months in year local d = math.floor( days % calendar.YEAR_DAYS % calendar.MONTH_DAYS ) -- elapsed days in month local j = math.floor( days % calendar.YEAR_DAYS ) -- elapsed days in year if ordinal == nil then ordinal = false end if ordinal then y = y + 1 m = m + 1 d = d + 1 j = j + 1 end return d, m, y, j end calendar.get_date_string = function( str, env_date ) if not env_date then env_date = minetest.get_day_count( ) end if str == nil then str = S("%D days, %M months, %Y years") end local y, m, d, j = calendar.get_date() -- cardinal values str = string.gsub( str, "%%Y", y ) -- elapsed years in epoch str = string.gsub( str, "%%M", m ) -- elapsed months in year str = string.gsub( str, "%%D", d ) -- elapsed days in month str = string.gsub( str, "%%J", j ) -- elapsed days in year -- ordinal values str = string.gsub( str, "%%y", y + 1 ) -- current year of epoch str = string.gsub( str, "%%m", m + 1 ) -- current month of year str = string.gsub( str, "%%d", d + 1 ) -- current day of month str = string.gsub( str, "%%j", j + 1 ) -- current day of year str = string.gsub( str, "%%b", calendar.month_names[ m + 1 ] ) -- current month long name str = string.gsub( str, "%%h", calendar.month_names_short[ m + 1 ] ) -- current month short name str = string.gsub( str, "%%z", "%%" ) return str end dofile(minetest.get_modpath("calendar").."/gui.lua") dofile(minetest.get_modpath("calendar").."/command.lua") dofile(minetest.get_modpath("calendar").."/node.lua")