So, da das ja nachgefragt wurde, habe ich mir die Daten für die Eberron-Ebenen aus dem Source Code für den Calculator bei Wizards gezogen. Die Monde sind da auch irgendwie kodiert, aber daraus bin ich nicht schlau geworden.
Ich präsentiere also den Eberron-Kalender mit Sonnenjahr und Ebenen.
case class EberronCalendar(days : TimeUnit = CommonDays.days){
lazy val weeks = 'week of days withNames("Sul","Mol","Zol","Wir","Zor","Far","Sar")
lazy val months = 'month of (weeks, 4)
lazy val years = 'year of months withNames(
"Zarantyr","Olarune","Therendor",
"Eyre","Dravago","Nymm",
"Lharvion","Barrakas","Rhaan",
"Sypheros","Aryth","Vult"
)
lazy val solarCalendar = Calendar(years) setTimestampZero 998
// Name, Orbit, RemainsNotable, StartingPosition
private val planeData = Vector(
("Danvi",134400,33600,50400),
("Dolurrh",33600,336,8559),
("Fernia",1680,28,1344),
("Irian",1008,10,420),
("Lamannia",364,7,94),
("Mabar",1680,3,422),
("Risia",1680,28,505),
("Shavarath",12096,336,4032),
("Syrania",3360,1,841),
("Thelanis",75600,2352,20076),
("Xoriat",2352000,336,588168)
)
def planeNames = planeData.map(_._1)
lazy val planesFactory = Satellites.withPhases(("Remote","Waxing"),("Coterminous","Waning"))
/**
* The planes orbiting the world of Eberron as a CalendarSystem.
* Except for Dal Quor, which is always remote, and Kythri which is utterly random.
*/
lazy val planes : Vector[Calendar] = planeData.map{
case (name,orbit,remainsNotable,startingPosition) =>
{
val phase = if (startingPosition < orbit/2) 1 else 2
val day = startingPosition % (orbit/2)
planesFactory.make(name.toLowerCase,orbit,days,remainsNotable) setTimestampZero (0,phase,day)
}
}
lazy val eberronCalendar : Calendar = planes.foldLeft (CalendarSystem(Vector(solarCalendar )))
{ case (sys: Calendar,simple: Calendar) => sys synchronise simple}
}
Zu dem Zweck habe ich gleich eine kleine Fabrik programmiert, die eben solche kreisenden Objekte macht.
Dazu gibts jetzt die Möglichkeit, einem Kalender berechnete Werte hinzuzufügen. Wenn man z.B. Kalenderwochen haben will, die Informationen aus zwei Zyklen brauchen (also Jahreszyklus und Wochenzyklus), oder sonstige Informationen einem Datum hinzufügen will.
Ansonsten diverse Korrekturen in den Beispielen, jetzt im Repository.