Vana'diel 時刻を計算する
MEMORANDUM
オンラインゲーム FINAL FANTASY XI の世界で流れている時刻を、現在の地球時間から計算する方法について調べてみました。
曜日や月齢の流れや、ひと月あたりの日数についても調べてみました。
Vana'diel 時刻を計算する
■ はじめに
ここの備忘録は、あくまでも走り書き程度のメモ的なものですので気をつけてください。
そのままでもちゃんと動くもの、手を加えないとだめなものなど、未完成レベルのコードです。ので、そのまま引用してしまうなど、プログラムを理解する知識のない方は利用しないでくださいね。
■ 概要
今回は SQUARE-ENIX 社のネットワークゲーム、FINAL FANTASY XI の時刻を計算するための予備知識を調べたついでにメモに残してみることにしました。
なおここでは、Vana'diel での日時単位には [V] を、地球での日時単位には [E] を付加するものとします。
day[V] | day[E] | それぞれ Vana'diel および地球での日を表す [day] |
---|---|---|
hour[V] | hour[E] | それぞれ Vana'diel および地球での時間を表す [hour] |
min[V] | min[E] | それぞれ Vana'diel および地球での分を表す [minute] |
sec[V] | sec[E] | それぞれ Vana'diel および地球での秒を表す [second] |
msec[V] | msec[E] | それぞれ Vana'diel および地球でのミリ秒を表す [milli-second] |
■ 地球時間からの換算
Vana'diel 時間は、1 day[V] = 57.6 min[E]、1 hour[V] = 2.4 min[E]。この後者から計算して、
1 hour[V] = 2.4 min[E]
= 2.4 x 60 sec[E]
1 sec(E) = (1 / (2.4 x 60)) hour[V]
= (60 / (2.4 x 60)) min[V]
= (1 / 2.4) min[V]
= (60 / 2.4) sec[V]
= 25 sec[V]
ゆえに地球 1 秒辺り、Vana'diel で 25 秒経過する計算。このとき Vana'diel 1 秒辺り、地球では 0.04 秒の時間が流れる。
また、これをミリ秒単位に換算すると、
1 sec[V] = 40 msec[E]
なので、インターバルを 40 に設定すれば、Vana'diel の 1 秒が刻めそう。
■ 基準時刻
基準とできる時刻は 2002/01/01 00:00:00 [E] が、886/01/01 00:00:00 とのこと。ちなみに Vana'diel ・地球ともに火曜日らしい。
簡単に時刻と曜日さえわかればいいなら、これを 0 とした経過秒数で計算すれば楽かも。Vana'diel の時間は 25 倍なので、地球時間で 2002/01/01 00:00:00 から何秒経過したかがわかれば、Vana'diel 時間でも 886/01/01 00:00:00 から何秒経過したかがわかるはず。
Vana'diel の月数や日数は不明…。
ただ、どうやら毎月 30 日固定で、1 月 1 日が 「火」 曜日の様子。曜日の順番は、火 → 土 → 水 → 風 → 氷 → 雷 → 光 → 闇。 月の範囲は現実同様、1 月から 12 月まで。
■ 月齢
Vana'diel の月齢は次のものがあるようです。
- 新月
- 三日月
- 七日月
- 上弦の月
- 十日夜
- 十三夜
- 満月
- 十六夜
- 居待月
- 下弦の月
- 二十日余月
- 二十六夜
これらが Vana'diel 時間の 7 日おきに移り変わっていくようです。
■ JavaScript で組んでみた時のメモ
インターバル
インターバル 40 で Vana'diel 時間を刻もうとすると処理の遅れが目立つ模様なので、Vana'diel 5 秒ごとにしたり、てきとうに同期するタイミングを入れたりして調整するのがいい様子。
桁数
直接的にはあまり関係はない話題。
ある特定の値が何桁であるかどうかを調べるには、特定の値を x とすると log x を切り上げたのがその答え。ただ、JavaScript に常用対数がないのか見つからないのか、底の変換をしなくてはいけない模様。
log x = y
10y = x
loge 10y = loge x
y loge 10 = loge x
y = loge x / loge 10 (底の変換公式)
よって、JavaScript だと、y = Math.log(x) / Math.LN10 となる様子。あとはこれを切り上げて Math.ceil(Math.log(x) / Math.LN10) で桁数が算出できるらしい。