VanaTime 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +3 -0
- data/LICENSE +19 -0
- data/Manifest +9 -0
- data/README +97 -0
- data/VanaTime.gemspec +42 -0
- data/lib/Vana/constants.rb +42 -0
- data/lib/Vana/day.rb +52 -0
- data/lib/Vana/moon.rb +93 -0
- data/lib/Vana/time.rb +99 -0
- data/lib/vana_time.rb +5 -123
- metadata +19 -31
- data/History.txt +0 -5
- data/Manifest.txt +0 -11
- data/README.txt +0 -3
- data/Rakefile +0 -21
- data/spec/spec.opts +0 -1
- data/spec/spec_helper.rb +0 -9
- data/spec/vana_time_spec.rb +0 -86
- data/tasks/rspec.rake +0 -21
data/CHANGELOG
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Copyright (c) 2007 Travis Tilley
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
5
|
+
in the Software without restriction, including without limitation the rights
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
11
|
+
all copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
THE SOFTWARE.
|
data/Manifest
ADDED
data/README
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
VanaTime 1.1.0 README
|
2
|
+
=====================
|
3
|
+
|
4
|
+
This document was last updated on Thu Aug 30 22:58:05 EDT 2007.
|
5
|
+
|
6
|
+
|
7
|
+
Introduction to VanaTime
|
8
|
+
========================
|
9
|
+
VanaTime is a group of classes that deal with times, days, and moon phases
|
10
|
+
in the MMORPG Final Fantasy Online (aka FFXI). Besides translating earth
|
11
|
+
time to game time, you can also convert game time to real time, step forward
|
12
|
+
a day, get a time estimate about how long you have left until the next
|
13
|
+
optimal moon phase, and a few other useful features.
|
14
|
+
|
15
|
+
VanaTime is a work in progress and the API may change from time to time...
|
16
|
+
you may want to use explicit versioning in any code depending on it.
|
17
|
+
|
18
|
+
|
19
|
+
FFXI::VanaTime API
|
20
|
+
==================
|
21
|
+
|
22
|
+
* new(Time)
|
23
|
+
accepts a Time object to initialize a new VanaTime, using the current
|
24
|
+
time if no Time object is passed
|
25
|
+
* now
|
26
|
+
an alias for new as a convenience method
|
27
|
+
* at(VanaTime)
|
28
|
+
accepts a VanaTime object, int, or float representing vana time to
|
29
|
+
initialize a new VanaTime object
|
30
|
+
* earth_time=(Time)
|
31
|
+
allows re-initializing a VanaTime object with a new earth time
|
32
|
+
* vana_time=(VanaTime)
|
33
|
+
allows re-initializing a VanaTime object with a new vana time, given
|
34
|
+
as a VanaTime object (why not >_>), or (more useful) an int or float
|
35
|
+
* to_i
|
36
|
+
returns an integer with the internal representation of vana time
|
37
|
+
* to_f
|
38
|
+
returns a float with the internal representation of vana time without
|
39
|
+
losing any accuracy
|
40
|
+
* year
|
41
|
+
* month
|
42
|
+
* date
|
43
|
+
* hour
|
44
|
+
* minute
|
45
|
+
* second
|
46
|
+
these methods return various times, what we're interested in
|
47
|
+
* to_s
|
48
|
+
returns a string in the format:
|
49
|
+
YYYY-MM-DD hh:mm:ss
|
50
|
+
* day
|
51
|
+
returns a VanaDay object initialized with the current VanaTime
|
52
|
+
* moon
|
53
|
+
returns a VanaMoon object initialized with the current time
|
54
|
+
|
55
|
+
|
56
|
+
FFXI::VanaDay API
|
57
|
+
=================
|
58
|
+
|
59
|
+
* new(VanaTime)
|
60
|
+
accepts a VanaTime object used to initialize the vana day, using a new
|
61
|
+
VanaTime initialized to the current time if one isn't passed
|
62
|
+
* vana_time=(VanaTime)
|
63
|
+
used to reinitialize the vana day object with a new time
|
64
|
+
* to_i
|
65
|
+
returns a base zero number representing the day of the week
|
66
|
+
* to_s
|
67
|
+
returns the name of the day of the week
|
68
|
+
* weak_element
|
69
|
+
returns the element that the current day is weak to
|
70
|
+
* day_start
|
71
|
+
returns a VanaTime object representing the start of the current day
|
72
|
+
* tomorrow
|
73
|
+
returns a VanaTime object representing the start of the next vana day
|
74
|
+
|
75
|
+
|
76
|
+
FFXI::VanaMoon API
|
77
|
+
==================
|
78
|
+
|
79
|
+
* new(Time)
|
80
|
+
Unlike VanaDay, VanaMoon is initialized with the current earth time
|
81
|
+
* to_i or moon_percent
|
82
|
+
returns a number representing the exact position along the progression
|
83
|
+
of moon phases
|
84
|
+
* moon_phase
|
85
|
+
returns a base zero number representing the current moon phase
|
86
|
+
* phase_name
|
87
|
+
returns the name of the current phase (full, waning gibbous, etc)
|
88
|
+
* next_optimal_phase
|
89
|
+
returns a base zero number representing the next optimal moon phase
|
90
|
+
* to_next_phase
|
91
|
+
returns an array with a countdown until the next moon phase
|
92
|
+
[day, hour, minute, second]
|
93
|
+
* to_optimal_phase
|
94
|
+
returns an array with a countdown until the next optimal phase with the
|
95
|
+
same format as above
|
96
|
+
* to_s
|
97
|
+
returns a string in the format: moon_percent.abs phase_name
|
data/VanaTime.gemspec
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
|
2
|
+
# Gem::Specification for Vanatime-1.1.0
|
3
|
+
# Originally generated by Echoe
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = %q{VanaTime}
|
7
|
+
s.version = "1.1.0"
|
8
|
+
s.date = %q{2007-08-30}
|
9
|
+
s.summary = %q{A library for converting realtime to vanadiel time}
|
10
|
+
s.email = %q{ttilley@gmail.com}
|
11
|
+
s.homepage = %q{http://vanatime.rubyforge.org/}
|
12
|
+
s.rubyforge_project = %q{vanatime}
|
13
|
+
s.description = %q{A library for converting realtime to vanadiel time}
|
14
|
+
s.has_rdoc = true
|
15
|
+
s.authors = ["Travis Tilley"]
|
16
|
+
s.files = ["README", "Manifest", "LICENSE", "lib/vana_time.rb", "lib/Vana/time.rb", "lib/Vana/moon.rb", "lib/Vana/day.rb", "lib/Vana/constants.rb", "CHANGELOG", "VanaTime.gemspec"]
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
# # Original Rakefile source (requires the Echoe gem):
|
21
|
+
#
|
22
|
+
# version = "1.1.0"
|
23
|
+
#
|
24
|
+
# ENV['RUBY_FLAGS'] = ""
|
25
|
+
#
|
26
|
+
# begin
|
27
|
+
# require 'rubygems'
|
28
|
+
# gem 'echoe', '=2.3'
|
29
|
+
# require 'echoe'
|
30
|
+
#
|
31
|
+
# Echoe.new('VanaTime', version) do |p|
|
32
|
+
# p.rubyforge_name = 'vanatime'
|
33
|
+
# p.summary = "A library for converting realtime to vanadiel time"
|
34
|
+
# p.url = "http://vanatime.rubyforge.org/"
|
35
|
+
# p.author = 'Travis Tilley'
|
36
|
+
# p.email = "ttilley@gmail.com"
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
# rescue LoadError => boom
|
40
|
+
# puts "You are missing a dependency required for meta-operations on this gem."
|
41
|
+
# puts "#{boom.to_s.capitalize}."
|
42
|
+
# end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# The following is quoted from http://ffxi.xenoveritas.org/tools/vanaclock/time
|
2
|
+
|
3
|
+
# Vana'diel time is exactly 25 times faster than normal time. This means that in
|
4
|
+
# one Earth hour, exactly 25 Vana'diel hours will have passed. Vana'diel time
|
5
|
+
# has 12 months, each of exactly 30 days. This means that a Vana'diel year is
|
6
|
+
# 360 days, not 365 like an Earth year. A Vana'diel week consists of eight days,
|
7
|
+
# one for each element. The order of days is Firesday, Earthsday, Watersday,
|
8
|
+
# Windsday, Iceday, Lightningsday, Lightsday, and Darksday. Note that this means
|
9
|
+
# that a Vana'diel month is two days shy of being four Vana'diel weeks. Other
|
10
|
+
# than that, Vana'diel time is exactly like Earth time - 24 hours in one day, 60
|
11
|
+
# minutes to an hour. I don't know who originally discovered the following, but,
|
12
|
+
# the following information can be used to set an "epoch" for Vana'diel time
|
13
|
+
# compared to Earth time:
|
14
|
+
|
15
|
+
# Earth time: 2002/06/23 15:00:00 GMT
|
16
|
+
# Vana'diel time: 0898/02/01 00:00:00
|
17
|
+
|
18
|
+
# Using that, you can take any given Earth time, subtract the starting Earth
|
19
|
+
# date to set time to "0", and then multiply that by 25 to convert to Vana'diel
|
20
|
+
# time.
|
21
|
+
|
22
|
+
module FFXI
|
23
|
+
module Constants
|
24
|
+
MINUTE = 60
|
25
|
+
HOUR = MINUTE * 60
|
26
|
+
DAY = HOUR * 24
|
27
|
+
|
28
|
+
MS_SECOND = 1000
|
29
|
+
MS_DAY = DAY * MS_SECOND
|
30
|
+
MS_HOUR = HOUR * MS_SECOND
|
31
|
+
MS_MINUTE = MINUTE * MS_SECOND
|
32
|
+
|
33
|
+
MS_GAME_DAY = (MS_DAY / 25)
|
34
|
+
|
35
|
+
BASIS_DATE = Time.utc(2002,6,23,15,0,0,0)
|
36
|
+
MOON_DATE = Time.utc(2004,1,25,2,31,12,0)
|
37
|
+
|
38
|
+
MS_BASIS_VANA = ((898 * 360 + 30) * MS_DAY).to_f
|
39
|
+
MS_BASIS_DATE = BASIS_DATE.to_f * MS_SECOND
|
40
|
+
MS_MOON_DATE = MOON_DATE.to_f * MS_SECOND
|
41
|
+
end
|
42
|
+
end
|
data/lib/Vana/day.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
module FFXI
|
2
|
+
class VanaDay
|
3
|
+
include FFXI::Constants
|
4
|
+
|
5
|
+
VANA_DAYS = ["Firesday", "Earthsday", "Watersday", "Windsday", "Iceday",
|
6
|
+
"Lightningday", "Lightsday", "Darksday"]
|
7
|
+
|
8
|
+
DAY_WEAKNESS = ["Ice", "Lightning", "Fire", "Earth", "Wind", "Water",
|
9
|
+
"Darkness", "Light"]
|
10
|
+
|
11
|
+
def initialize(vana_time=VanaTime.now)
|
12
|
+
self.vana_time = vana_time
|
13
|
+
end
|
14
|
+
|
15
|
+
attr_reader :vana_time
|
16
|
+
|
17
|
+
def vana_time=(vana_time)
|
18
|
+
@vana_time = vana_time
|
19
|
+
|
20
|
+
vana_day = (@vana_time.to_f % (8 * MS_DAY)) / (MS_DAY)
|
21
|
+
|
22
|
+
if @vana_day.nil?
|
23
|
+
@vana_day = vana_day
|
24
|
+
elsif @vana_day != vana_day
|
25
|
+
@vana_day = vana_day
|
26
|
+
@vana_day_start = nil
|
27
|
+
@vana_day_tomorrow = nil
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def to_i
|
32
|
+
@vana_day.to_i
|
33
|
+
end
|
34
|
+
|
35
|
+
def to_s
|
36
|
+
VANA_DAYS[@vana_day]
|
37
|
+
end
|
38
|
+
|
39
|
+
def weak_element
|
40
|
+
DAY_WEAKNESS[@vana_day]
|
41
|
+
end
|
42
|
+
|
43
|
+
def day_start
|
44
|
+
@vana_day_start ||=
|
45
|
+
VanaTime.at(@vana_time.to_f - (@vana_time.to_f % MS_DAY ))
|
46
|
+
end
|
47
|
+
|
48
|
+
def tomorrow
|
49
|
+
@vana_day_tomorrow ||= VanaTime.at(day_start.to_f + MS_DAY)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/Vana/moon.rb
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
module FFXI
|
2
|
+
class VanaMoon
|
3
|
+
include FFXI::Constants
|
4
|
+
|
5
|
+
MOON_PHASES = ["Full", "Waning Gibbous", "Last Quarter", "Waning Crescent",
|
6
|
+
"New Moon", "Waxing Crescent", "First Quarter", "Waxing Gibbous"]
|
7
|
+
|
8
|
+
def initialize(time = Time.now)
|
9
|
+
localtime = (time.to_f * 1000).to_i
|
10
|
+
# Each lunar cycle takes exactly 84 game days
|
11
|
+
# (3 days, 8 hours, 38 minutes, 24 seconds)
|
12
|
+
@moon_days = ((localtime - MS_MOON_DATE.to_i) / MS_GAME_DAY).floor % 84
|
13
|
+
@moon_percent = - ((42 - @moon_days).to_f / 42 * 100).round
|
14
|
+
@elapsed_time = (localtime - MS_MOON_DATE.to_i) % MS_GAME_DAY
|
15
|
+
|
16
|
+
case @moon_percent
|
17
|
+
when (-100..-94)
|
18
|
+
@moon_phase = 0
|
19
|
+
@next_phase_target = 3
|
20
|
+
when (90..100)
|
21
|
+
@moon_phase = 0
|
22
|
+
@next_phase_target = 3 + 84
|
23
|
+
when (-93..-62)
|
24
|
+
@moon_phase = 1
|
25
|
+
@next_phase_target = 17
|
26
|
+
when (-61..-41)
|
27
|
+
@moon_phase = 2
|
28
|
+
@next_phase_target = 25
|
29
|
+
when (-40..-11)
|
30
|
+
@moon_phase = 3
|
31
|
+
@next_phase_target = 38
|
32
|
+
when (-10..6)
|
33
|
+
@moon_phase = 4
|
34
|
+
@next_phase_target = 45
|
35
|
+
when (7..36)
|
36
|
+
@moon_phase = 5
|
37
|
+
@next_phase_target = 58
|
38
|
+
when (37..56)
|
39
|
+
@moon_phase = 6
|
40
|
+
@next_phase_target = 66
|
41
|
+
when (57..89)
|
42
|
+
@moon_phase = 7
|
43
|
+
@next_phase_target = 60
|
44
|
+
end
|
45
|
+
|
46
|
+
case @moon_phase
|
47
|
+
when (0..3)
|
48
|
+
@next_optimal_phase = 4
|
49
|
+
@optimal_phase_target = 38
|
50
|
+
@optimal_phase_target += 84 if (90..100).include? @moon_percent
|
51
|
+
when (4..7)
|
52
|
+
@next_optimal_phase = 0
|
53
|
+
@optimal_phase_target = 80
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
attr_reader :elapsed_time, :moon_days, :moon_percent, :moon_phase,
|
58
|
+
:next_optimal_phase
|
59
|
+
|
60
|
+
def countdown(time)
|
61
|
+
day_left = time.to_f / MS_DAY
|
62
|
+
hour_left = (day_left.to_f - day_left.floor) * 24
|
63
|
+
min_left = (hour_left.to_f - hour_left.floor) * 60
|
64
|
+
sec_left = (min_left.to_f - min_left.floor) * 60
|
65
|
+
|
66
|
+
[day_left.floor, hour_left.floor, min_left.floor, sec_left.floor]
|
67
|
+
end
|
68
|
+
|
69
|
+
def phase_countdown(target)
|
70
|
+
countdown((target - @moon_days) * MS_GAME_DAY - @elapsed_time)
|
71
|
+
end
|
72
|
+
|
73
|
+
def to_next_phase
|
74
|
+
phase_countdown(@next_phase_target)
|
75
|
+
end
|
76
|
+
|
77
|
+
def to_optimal_phase
|
78
|
+
phase_countdown(@optimal_phase_target)
|
79
|
+
end
|
80
|
+
|
81
|
+
def to_i
|
82
|
+
@moon_percent
|
83
|
+
end
|
84
|
+
|
85
|
+
def phase_name
|
86
|
+
MOON_PHASES[@moon_phase]
|
87
|
+
end
|
88
|
+
|
89
|
+
def to_s
|
90
|
+
"#{@moon_percent.abs}% #{phase_name}"
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
data/lib/Vana/time.rb
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
module FFXI
|
2
|
+
class VanaTime
|
3
|
+
include FFXI::Constants
|
4
|
+
|
5
|
+
def initialize(time = Time.now)
|
6
|
+
self.earth_time = time
|
7
|
+
end
|
8
|
+
|
9
|
+
def update_instance_variables
|
10
|
+
# the day object knows how to update only what is necessary, so if there
|
11
|
+
# is an existing VanaDay object, update it
|
12
|
+
if ! @vDay.nil?
|
13
|
+
@vDay.vana_time = @vana_time
|
14
|
+
end
|
15
|
+
|
16
|
+
# nil these until they're used and updated later
|
17
|
+
@vYear=@vMon=@vDate=@vHour=@vMin=@vSec=@vana_moon=nil
|
18
|
+
end
|
19
|
+
|
20
|
+
def earth_time=(time)
|
21
|
+
raise "input needs to be a Time object" if ! time.is_a? Time
|
22
|
+
|
23
|
+
@earth_time = time
|
24
|
+
ms_earth_time = @earth_time.to_f * MS_SECOND
|
25
|
+
@vana_time = ((898 * 360 + 30) * MS_DAY) +
|
26
|
+
(ms_earth_time - MS_BASIS_DATE) * 25
|
27
|
+
|
28
|
+
update_instance_variables
|
29
|
+
end
|
30
|
+
|
31
|
+
attr_reader :earth_time
|
32
|
+
|
33
|
+
def self.vana_to_earth(vana_time)
|
34
|
+
(((vana_time.to_f - ((898 * 360 + 30) * MS_DAY.to_f)) / 25) +
|
35
|
+
MS_BASIS_DATE.to_f) / MS_SECOND
|
36
|
+
end
|
37
|
+
|
38
|
+
def vana_time=(vana_time)
|
39
|
+
@vana_time = vana_time.to_f
|
40
|
+
@earth_time = Time.at(self.class.vana_to_earth(vana_time))
|
41
|
+
|
42
|
+
update_instance_variables
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.at(vana_time)
|
46
|
+
self.new(Time.at(self.vana_to_earth(vana_time)))
|
47
|
+
end
|
48
|
+
|
49
|
+
def to_i
|
50
|
+
@vana_time.to_i
|
51
|
+
end
|
52
|
+
|
53
|
+
def to_f
|
54
|
+
@vana_time.to_f
|
55
|
+
end
|
56
|
+
|
57
|
+
def year
|
58
|
+
@vYear ||= (@vana_time / (360 * MS_DAY)).to_i
|
59
|
+
end
|
60
|
+
|
61
|
+
def month
|
62
|
+
@vMon ||= (((@vana_time % (360 * MS_DAY)) / (30 * MS_DAY)) + 1).to_i
|
63
|
+
end
|
64
|
+
|
65
|
+
def date
|
66
|
+
@vDate ||= (((@vana_time % (30 * MS_DAY)) / (MS_DAY)) + 1).to_i
|
67
|
+
end
|
68
|
+
|
69
|
+
def hour
|
70
|
+
@vHour ||= ((@vana_time % MS_DAY) / MS_HOUR).to_i
|
71
|
+
end
|
72
|
+
|
73
|
+
def minute
|
74
|
+
@vMin ||= ((@vana_time % MS_HOUR) / MS_MINUTE).to_i
|
75
|
+
end
|
76
|
+
|
77
|
+
def second
|
78
|
+
@vSec ||= ((@vana_time % MS_MINUTE) / MS_SECOND).to_i
|
79
|
+
end
|
80
|
+
|
81
|
+
def day
|
82
|
+
@vDay ||= VanaDay.new(@vana_time)
|
83
|
+
end
|
84
|
+
|
85
|
+
def moon
|
86
|
+
@vana_moon ||= VanaMoon.new(@earth_time)
|
87
|
+
end
|
88
|
+
|
89
|
+
def self.now
|
90
|
+
self.new
|
91
|
+
end
|
92
|
+
|
93
|
+
def to_s
|
94
|
+
"#{year}-#{"%02d" % month}-#{"%02d" % date}" +
|
95
|
+
" #{"%02d" % hour}:#{"%02d" % minute}:#{"%02d" % second}"
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
end
|
data/lib/vana_time.rb
CHANGED
@@ -1,124 +1,6 @@
|
|
1
|
-
|
2
|
-
VERSION = '1.0.0'
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
self.earth_time = time
|
9
|
-
end
|
10
|
-
|
11
|
-
def earth_time=(time)
|
12
|
-
raise "Input was not a Time object" if ! time.is_a?(Time)
|
13
|
-
|
14
|
-
@earth_time = time
|
15
|
-
@vana_time = ((898 * 360 + 30) * SECONDS_REAL_DAY) +
|
16
|
-
(@earth_time.to_i - BASIS_DATE.to_i) * 25
|
17
|
-
|
18
|
-
@vDate = @vDay = @vHour = @vMin = @vMon = @vMoon = @vSec = @vYear = nil
|
19
|
-
end
|
20
|
-
|
21
|
-
attr_reader :earth_time
|
22
|
-
|
23
|
-
def self.vana_to_earth(vana_time)
|
24
|
-
((vana_time - ((898 * 360 + 30) * SECONDS_REAL_DAY)) / 25) + BASIS_DATE.to_i
|
25
|
-
end
|
26
|
-
|
27
|
-
def vana_time=(vana_time)
|
28
|
-
@vana_time = vana_time
|
29
|
-
@earth_time = Time.at(self.class.vana_to_earth(vana_time))
|
30
|
-
|
31
|
-
@vDate = @vDay = @vHour = @vMin = @vMon = @vMoon = @vSec = @vYear = nil
|
32
|
-
end
|
33
|
-
|
34
|
-
def self.at(vana_time)
|
35
|
-
self.new(Time.at(self.vana_to_earth(vana_time)))
|
36
|
-
end
|
37
|
-
|
38
|
-
def to_i
|
39
|
-
@vana_time
|
40
|
-
end
|
41
|
-
|
42
|
-
def year
|
43
|
-
@vYear ||= (@vana_time / (360 * SECONDS_REAL_DAY))
|
44
|
-
end
|
45
|
-
|
46
|
-
def month
|
47
|
-
@vMon ||= ((@vana_time % (360 * SECONDS_REAL_DAY)) /
|
48
|
-
(30 * SECONDS_REAL_DAY)) + 1
|
49
|
-
end
|
50
|
-
|
51
|
-
def date
|
52
|
-
@vDate ||= ((@vana_time % (30 * SECONDS_REAL_DAY)) /
|
53
|
-
(SECONDS_REAL_DAY)) + 1
|
54
|
-
end
|
55
|
-
|
56
|
-
def hour
|
57
|
-
@vHour ||= ((@vana_time % (SECONDS_REAL_DAY)) / (60 * 60))
|
58
|
-
end
|
59
|
-
|
60
|
-
def minute
|
61
|
-
@vMin ||= ((@vana_time % (60 * 60)) / (60))
|
62
|
-
end
|
63
|
-
|
64
|
-
def second
|
65
|
-
@vSec ||= (@vana_time % 60)
|
66
|
-
end
|
67
|
-
|
68
|
-
class VanaDay
|
69
|
-
VANA_DAYS = ["Firesday", "Earthsday", "Watersday", "Windsday", "Iceday",
|
70
|
-
"Lightningday", "Lightsday", "Darksday"]
|
71
|
-
def initialize(vana_time)
|
72
|
-
@vanaDay = ((vana_time % (8 * SECONDS_REAL_DAY)) / (SECONDS_REAL_DAY))
|
73
|
-
end
|
74
|
-
def to_i
|
75
|
-
@vanaDay
|
76
|
-
end
|
77
|
-
def to_s
|
78
|
-
VANA_DAYS[@vanaDay]
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
def day
|
83
|
-
@vDay ||= VanaDay.new(@vana_time)
|
84
|
-
end
|
85
|
-
|
86
|
-
class VanaMoon
|
87
|
-
SECONDS_GAME_DAY = (24 * 60 * 60 / 25)
|
88
|
-
MOON_DATE = Time.utc(2004,1,25,2,31,12,0)
|
89
|
-
def initialize(time)
|
90
|
-
moon_days = ((time.to_i - MOON_DATE.to_i) / SECONDS_GAME_DAY).floor % 84
|
91
|
-
moon_days += 84 if moon_days < 0
|
92
|
-
@moonPercent = - ((42 - moon_days).to_f / 42 * 100).round
|
93
|
-
end
|
94
|
-
def to_i
|
95
|
-
@moonPercent
|
96
|
-
end
|
97
|
-
def to_s
|
98
|
-
if (@moonPercent == -100)
|
99
|
-
"100% Full Moon"
|
100
|
-
elsif (@moonPercent == 0)
|
101
|
-
"0% New Moon"
|
102
|
-
elsif (@moonPercent < 0)
|
103
|
-
"#{-@moonPercent}% Waning"
|
104
|
-
elsif (@moonPercent > 0)
|
105
|
-
"#{@moonPercent}% Waxing"
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
def moon_phase
|
111
|
-
@vMoon ||= VanaMoon.new(@earth_time)
|
112
|
-
end
|
113
|
-
|
114
|
-
def self.now
|
115
|
-
self.new
|
116
|
-
end
|
117
|
-
|
118
|
-
def to_s
|
119
|
-
"Vanadiel Time: #{day} #{year}-#{month}-#{date}" +
|
120
|
-
" #{hour}:#{minute}:#{second}" + "\n" + "Moon Phase: #{moon_phase}" +
|
121
|
-
"\n" + "Earth Time: #{earth_time.httpdate}"
|
122
|
-
end
|
123
|
-
|
124
|
-
end
|
3
|
+
require 'Vana/constants'
|
4
|
+
require 'Vana/day'
|
5
|
+
require 'Vana/moon'
|
6
|
+
require 'Vana/time'
|
metadata
CHANGED
@@ -3,13 +3,13 @@ rubygems_version: 0.9.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: VanaTime
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.
|
7
|
-
date: 2007-08-
|
8
|
-
summary:
|
6
|
+
version: 1.1.0
|
7
|
+
date: 2007-08-30 00:00:00 -04:00
|
8
|
+
summary: A library for converting realtime to vanadiel time
|
9
9
|
require_paths:
|
10
10
|
- lib
|
11
11
|
email: ttilley@gmail.com
|
12
|
-
homepage: http://vanatime.rubyforge.org
|
12
|
+
homepage: http://vanatime.rubyforge.org/
|
13
13
|
rubyforge_project: vanatime
|
14
14
|
description: A library for converting realtime to vanadiel time
|
15
15
|
autorequire:
|
@@ -29,39 +29,27 @@ post_install_message:
|
|
29
29
|
authors:
|
30
30
|
- Travis Tilley
|
31
31
|
files:
|
32
|
-
-
|
33
|
-
- Manifest
|
34
|
-
-
|
35
|
-
- Rakefile
|
32
|
+
- README
|
33
|
+
- Manifest
|
34
|
+
- LICENSE
|
36
35
|
- lib/vana_time.rb
|
37
|
-
-
|
38
|
-
-
|
39
|
-
-
|
40
|
-
-
|
41
|
-
-
|
42
|
-
-
|
36
|
+
- lib/Vana/time.rb
|
37
|
+
- lib/Vana/moon.rb
|
38
|
+
- lib/Vana/day.rb
|
39
|
+
- lib/Vana/constants.rb
|
40
|
+
- CHANGELOG
|
41
|
+
- VanaTime.gemspec
|
43
42
|
test_files: []
|
44
43
|
|
45
|
-
rdoc_options:
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
- History.txt
|
50
|
-
- Manifest.txt
|
51
|
-
- README.txt
|
44
|
+
rdoc_options: []
|
45
|
+
|
46
|
+
extra_rdoc_files: []
|
47
|
+
|
52
48
|
executables: []
|
53
49
|
|
54
50
|
extensions: []
|
55
51
|
|
56
52
|
requirements: []
|
57
53
|
|
58
|
-
dependencies:
|
59
|
-
|
60
|
-
name: hoe
|
61
|
-
version_requirement:
|
62
|
-
version_requirements: !ruby/object:Gem::Version::Requirement
|
63
|
-
requirements:
|
64
|
-
- - ">="
|
65
|
-
- !ruby/object:Gem::Version
|
66
|
-
version: 1.3.0
|
67
|
-
version:
|
54
|
+
dependencies: []
|
55
|
+
|
data/History.txt
DELETED
data/Manifest.txt
DELETED
data/README.txt
DELETED
data/Rakefile
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
# -*- ruby -*-
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
require 'hoe'
|
5
|
-
require './lib/vana_time.rb'
|
6
|
-
|
7
|
-
Hoe.new('VanaTime', VanaTime::VERSION) do |p|
|
8
|
-
p.rubyforge_name = 'vanatime'
|
9
|
-
p.author = 'Travis Tilley'
|
10
|
-
p.email = 'ttilley@gmail.com'
|
11
|
-
p.summary = 'Vanadiel time object'
|
12
|
-
# p.description = p.paragraphs_of('README.txt', 2..5).join("\n\n")
|
13
|
-
p.description = "A library for converting realtime to vanadiel time"
|
14
|
-
# p.url = p.paragraphs_of('README.txt', 0).first.split(/\n/)[1..-1]
|
15
|
-
p.url = "http://vanatime.rubyforge.org"
|
16
|
-
p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
|
17
|
-
end
|
18
|
-
|
19
|
-
Dir['tasks/**/*.rake'].each { |rake| load rake }
|
20
|
-
|
21
|
-
# vim: syntax=Ruby
|
data/spec/spec.opts
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
--colour
|
data/spec/spec_helper.rb
DELETED
data/spec/vana_time_spec.rb
DELETED
@@ -1,86 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
-
|
3
|
-
describe VanaTime do
|
4
|
-
before(:all) do
|
5
|
-
# this specific date translates to: seconds since vana epoch date ->
|
6
|
-
# 32009656750, vana year -> 1029, vana month -> 2, vana date -> 13, vana day
|
7
|
-
# of the week -> 2 (base 0) or Watersday, vana minute -> 19, vana hour -> 3,
|
8
|
-
# vana second -> 10, vana moon phase -> 62% waxing
|
9
|
-
@time = Time.utc(2007,8,23,12,15,10,10)
|
10
|
-
@vanatime = VanaTime.new(@time)
|
11
|
-
end
|
12
|
-
|
13
|
-
it "should raise an error when given invalid input" do
|
14
|
-
lambda {VanaTime.new("COWS")}.should raise_error
|
15
|
-
end
|
16
|
-
|
17
|
-
it "should provide an accessor for the earth time used to create the object" do
|
18
|
-
@vanatime.earth_time.should == @time
|
19
|
-
@vanatime.earth_time.class.should == Time
|
20
|
-
end
|
21
|
-
|
22
|
-
it "should use the current time if not initialized with a specific time" do
|
23
|
-
def Time.now
|
24
|
-
Time.utc(2007,8,23,12,15,10,10)
|
25
|
-
end
|
26
|
-
vanatime = VanaTime.new
|
27
|
-
vanatime.earth_time.should == Time.utc(2007,8,23,12,15,10,10)
|
28
|
-
end
|
29
|
-
|
30
|
-
it "to_i should return the vana time used in all other calculations as an int" do
|
31
|
-
@vanatime.to_i.is_a?(Integer).should == true
|
32
|
-
@vanatime.to_i.should == 32009656750
|
33
|
-
end
|
34
|
-
|
35
|
-
it "should provide accessor for vana year" do
|
36
|
-
@vanatime.year.to_i.should == 1029
|
37
|
-
end
|
38
|
-
|
39
|
-
it "should provide accessor for vana month" do
|
40
|
-
@vanatime.month.to_i.should == 2
|
41
|
-
end
|
42
|
-
|
43
|
-
it "should provide accessor for vana date" do
|
44
|
-
@vanatime.date.to_i.should == 13
|
45
|
-
end
|
46
|
-
|
47
|
-
it "should provide accessor for vana hour" do
|
48
|
-
@vanatime.hour.to_i.should == 3
|
49
|
-
end
|
50
|
-
|
51
|
-
it "should provide accessor for vana minute" do
|
52
|
-
@vanatime.minute.to_i.should == 19
|
53
|
-
end
|
54
|
-
|
55
|
-
it "should provide accessor for vana second" do
|
56
|
-
@vanatime.second.to_i.should == 10
|
57
|
-
end
|
58
|
-
|
59
|
-
it "should provide accessor for day of week" do
|
60
|
-
@vanatime.day.to_s.should == "Watersday"
|
61
|
-
end
|
62
|
-
|
63
|
-
it "should provide accessor for moon percent/phase" do
|
64
|
-
@vanatime.moon_phase.to_s.should == "62% Waxing"
|
65
|
-
@vanatime.moon_phase.to_i.should == 62
|
66
|
-
end
|
67
|
-
|
68
|
-
it "should allow reinitializing with a new earth time" do
|
69
|
-
vt = VanaTime.new(Time.utc(2007,8,23,12,15,10,10))
|
70
|
-
vtsec = vt.to_i
|
71
|
-
vanatwo = vt.earth_time=(Time.new)
|
72
|
-
vtwosec = vanatwo.to_i
|
73
|
-
vtsec.should_not == vtwosec
|
74
|
-
end
|
75
|
-
|
76
|
-
it "should allow reinitializing with a new vana time" do
|
77
|
-
reinit = VanaTime.new
|
78
|
-
reinit.vana_time = (@vanatime.to_i)
|
79
|
-
reinit.earth_time.to_i.should_not == @vanatime.to_i
|
80
|
-
end
|
81
|
-
|
82
|
-
it "should have a constructor using vana time" do
|
83
|
-
vt = VanaTime.at(@vanatime.to_i)
|
84
|
-
vt.earth_time.to_i.should == @vanatime.earth_time.to_i
|
85
|
-
end
|
86
|
-
end
|
data/tasks/rspec.rake
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
begin
|
2
|
-
require 'spec'
|
3
|
-
rescue LoadError
|
4
|
-
require 'rubygems'
|
5
|
-
require 'spec'
|
6
|
-
end
|
7
|
-
begin
|
8
|
-
require 'spec/rake/spectask'
|
9
|
-
rescue LoadError
|
10
|
-
puts <<-EOS
|
11
|
-
To use rspec for testing you must install rspec gem:
|
12
|
-
gem install rspec
|
13
|
-
EOS
|
14
|
-
exit(0)
|
15
|
-
end
|
16
|
-
|
17
|
-
desc "Run the specs under spec/models"
|
18
|
-
Spec::Rake::SpecTask.new do |t|
|
19
|
-
t.spec_opts = ['--options', "spec/spec.opts"]
|
20
|
-
t.spec_files = FileList['spec/*_spec.rb']
|
21
|
-
end
|