@@ -1,52 +1,103 @@ -- you can use your own month names and so on; even if you change -- the length of the year the code will adapt -local days = { - 'Day of the Frozen River'; 'Day of Fell Shadow'; - 'Day of Peaceful Splendor'; 'Day of Somber Reflection'; - 'Day of Wrathful Visitation'; 'Day of Wistful Remembrance'; - 'Day of the Warm Hearth'; 'Day of Joyous Worship'; - 'Day of the Fond Farewell'; +local imperial = { + days = { + 'Day of the Frozen River'; 'Day of Fell Shadow'; + 'Day of Peaceful Splendor'; 'Day of Somber Reflection'; + 'Day of Wrathful Visitation'; 'Day of Wistful Remembrance'; + 'Day of the Warm Hearth'; 'Day of Joyous Worship'; + 'Day of the Fond Farewell'; + }; + weeks = { + "Merchant's Week"; "Chandler's Week"; "Miller's Week"; + "Bard's Week"; "Cobbler's Week"; + }; + moons = { + 'Splendormoon'; + 'Embermoon'; + 'Saddlemoon'; + 'Candlemoon'; + 'Cindermoon'; + 'Diremoon'; + 'Chancelmoon'; + 'Starmoon'; + 'Harvestmoon'; + }; +} + +local magisterial = { + days = { + 'Shortmarket'; 'Fellwind'; 'Brightmorn'; 'Wandflame'; + 'Goldmorrow'; 'Slaketide'; 'Longmarket'; 'Furlblossom'; + }; + weeks = { + 'Slavemarket'; + 'Wandmarket'; + 'Thriftmarket'; + 'Darkmarket'; + 'Grand Feast'; + }; + moons = { + 'Moon of Lurking Shadow'; + 'Moon of Wandering Flame'; + "Wandwright's Moon"; + 'Moon of Dark Waters'; + "Shipwright's Moon"; + 'Moon of Singing Boughs'; + 'Moon of the Golden Tower'; + "Spellwright's Moon"; + 'Moon of Joysome Harvest'; + "Alchemist's Moon"; + }; + moon_abbr = { + 'MS', 'WF', 'WM', 'DM'; + 'SM', 'SB', 'GT', 'Sp.'; + 'JH', 'AM'; + }; } -local weeks = { - "Merchant's Week"; "Chandler's Week"; "Miller's Week"; - "Bard's Week"; "Cobbler's Week"; +local elerian = { + days = { + + }; + weeks = { + 'First Week', 'Second Week', 'Third Week'; + 'Fourth Week', 'Fifth Week', 'Sixth Week'; + }; + moons = { + 'Springrise'; + 'Springfall'; + 'Summerrise'; + 'Summerfall'; + 'Autumnrise'; + 'Autumnfall'; + 'Winterrise'; + 'Winterfall'; + }; } -local moons = { - 'Splendormoon'; - 'Embermoon'; - 'Saddlemoon'; - 'Candlemoon'; - 'Cindermoon'; - 'Diremoon'; - 'Chancelmoon'; - 'Starmoon'; - 'Harvestmoon'; +local adjs = { + 'Whimpering'; 'Overturned'; 'Silent'; 'Whimsical'; 'Turbulent'; + 'Parsimonius'; 'Rhadamanthine'; 'Exuberant'; 'Winsome'; + 'Bifurcated'; 'Shivering'; 'Splendorous'; 'Magnificent'; + 'Luminous'; 'Mouthy'; 'Wandering'; 'Vexatious'; 'Irksome'; + 'Wrathsome'; 'Fearsome'; 'Wretched'; 'Rambling'; 'Feculent'; + 'Insipid'; 'Mad'; 'Eternal'; 'Deathless'; 'Suppurating'; + 'Radiant'; 'Trembling'; 'Tremulous'; 'Incredulous'; 'False'; + 'Rambunctious'; } -local yearadj = { - 'Whimpering'; - 'Overturned'; - 'Silent'; - 'Whimsical'; - 'Turbulent'; - 'Parsimonius'; - 'Rhadamanthine'; - 'Exuberant'; - 'Winsome'; - 'Bifurcated'; -} +local nouns = { + 'Princeling'; 'Applecart'; 'Oxcart'; 'Parsnip'; 'Lotus'; + 'Daffodil'; 'Slave'; 'Ass'; 'Mare'; 'Stallion'; -local yearnoun = { - 'Princeling'; - 'Applecart'; - 'Oxcart'; - 'Parsnip'; - 'Lotus'; - 'Daffodil'; + {false,'Fortitude'};{false,'Providence'}; + {false,'Provocation'};{false,'Wisdom'}; + {false,'Perseverance'};{false,'Destruction'}; + {false,'Suppuration'};{false,'Terror'}; + {false,'Despair'};{false,'Glory'}; } local yg = function(y) local pos = -3 @@ -61,24 +112,62 @@ end if neg then n = '-' .. n end return string.sub(n,1,-2) end + +local classicyear = function(y) + local aofs,nofs = (y % 7),(y % 9) + local adj = adjs[(y*aofs) % #adjs + 1] + local noun = nouns[(y*nofs) % #nouns + 1] + if type(noun) == 'table' then + noun = noun[2] + if noun[1] then adj = 'the ' .. adj end + else + adj = 'the ' .. adj + end + return string.format('Year of %s %s', adj, noun) +end return { days_per_stellar_cycle = 17; + days_per_lunar_cycle = 32; default = 'imperial'; styles = { - imperial = { + imperial = sorcery.lib.tbl.merge(imperial, { name = 'Imperial Archipelagian Calendar'; - days = days, weeks = weeks, moons = moons; + longdate = function(date) + local day = imperial.days [date.day_of_week ] + local week = imperial.weeks[date.week_of_moon] + local moon = imperial.moons[date.moon_of_year] + return string.format('%s on %s in %s after %s years of the Imperial Revolution in the %s',day,week,moon,yg(date.year),classicyear(date.year)) + end; + yearname = classicyear; + shortdate = function(date) + return string.format('%u/%u I.R. %s', date.day_of_moon, date.moon_of_year, yg(date.year)) + end; + }); + magisterial = sorcery.lib.tbl.merge(magisterial, { + name = 'Old Magisterial Calendar'; + yearname = classicyear; longdate = function(date) - local day = days [date.day_of_week ] - local week = weeks[date.week_of_moon] - local moon = moons[date.moon_of_year] - return string.format('%s on %s in %s after %s years of the Imperial Revolution',day,week,moon,yg(date.year)) + local d,w,m = magisterial.days [date.day_of_week ], + magisterial.weeks[date.week_of_moon], + magisterial.moons[date.moon_of_year] + if w ~= 'Grand Feast' then + local n = ({Shortmarket = 'Short'; Longmarket = 'Long'})[d] + if n ~= nil then + return string.format('Day of the %s %s beneath the %s in the %s',n,w,m,classicyear(date.year)) + end + end + + return string.format('%s in the week of the %s beneath the %s in the %s',d,w,m,classicyear(date.year)) end; shortdate = function(date) - return string.format('%u/%u %s I.R.', date.day_of_moon, date.moon_of_year, yg(date.year)) + local l = (({Shortmarket = 'S'; Longmarket = 'L'})[magisterial.days[date.day_of_week]]) or tostring(date.day_of_week) + return string.format('%s-%s %s %sm', l, + magisterial.weeks[date.week_of_moon], + magisterial.moon_abbr[date.moon_of_year], + yg(date.year+1390)) end; - } + }); } }