demo-reader 0.2.3 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION +1 -1
- data/demo-reader.gemspec +3 -2
- data/lib/demo_reader_defrag.rb +47 -13
- data/test/fixtures/defrag/dm_68/vq3/cyfio-df_mdf.vq3_06.25.832_rlxmini.CountryHere.dm_68 +0 -0
- data/test/unit/demo_reader_defrag_dm_68_cpm_test.rb +1 -1
- data/test/unit/demo_reader_defrag_dm_68_vq3_test.rb +3 -2
- metadata +5 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.4
|
data/demo-reader.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{demo-reader}
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.4"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["aekym"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-12-19}
|
13
13
|
s.description = %q{A library to read warsow demo files (.wd8, .wd9, .wd10, .wd11 files) and q3 demo files (*.dm68)}
|
14
14
|
s.email = %q{me@aekym.com}
|
15
15
|
s.extensions = ["ext/dm68/extconf.rb"]
|
@@ -42,6 +42,7 @@ Gem::Specification.new do |s|
|
|
42
42
|
"lib/demo_reader_warsow.rb",
|
43
43
|
"test/fixtures/defrag/dm_68/cpm/pornchronostar_mdf.cpm_00.49.216_tyaz.germany.dm_68",
|
44
44
|
"test/fixtures/defrag/dm_68/cpm/puremotion_df.cpm_00.10.600_eS-Rody.russia.dm_68",
|
45
|
+
"test/fixtures/defrag/dm_68/vq3/cyfio-df_mdf.vq3_06.25.832_rlxmini.CountryHere.dm_68",
|
45
46
|
"test/fixtures/defrag/dm_68/vq3/runkull2_df.vq3_01.05.904_XunderBIRD.Germany.dm_68",
|
46
47
|
"test/fixtures/defrag/dm_68/vq3/un-dead029_df.vq3_00.16.912_uN-DeaD!WiNTeR.ru.dm_68",
|
47
48
|
"test/fixtures/warsow/wd10/racesow_0.42.b2/dinirun2_racesow_0.42.b2.wd10",
|
data/lib/demo_reader_defrag.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'yaml'
|
2
2
|
require 'dm68'
|
3
|
+
require 'active_support/core_ext/object'
|
3
4
|
|
4
5
|
class DemoReaderDefrag
|
5
6
|
attr_reader :filename, :version, :mapname, :time, :playernames, :scoreboards, :game, :gamemode, :player, :basegamedir, :gamedir, :valid
|
@@ -37,15 +38,17 @@ class DemoReaderDefrag
|
|
37
38
|
@version = @raw['server_info']['protocol'].to_i
|
38
39
|
@mapname = @raw['server_info']['mapname'].downcase
|
39
40
|
|
40
|
-
# @playernames = []
|
41
41
|
@scoreboards = @raw['prints']
|
42
42
|
@basegamedir = @raw['server_info']['gamename']
|
43
43
|
@gamedir = @raw['system_info']['fs_game']
|
44
44
|
|
45
45
|
if @raw['server_info']['defrag_vers'].to_i > 0
|
46
46
|
@gamemode = @raw['server_info']['df_promode'].to_i.zero? ? 'vq3' : 'cpm'
|
47
|
-
|
48
|
-
|
47
|
+
|
48
|
+
time_hint = extract_time_from_filename(@filename)
|
49
|
+
@time = extract_time(@raw['prints'], time_hint)
|
50
|
+
|
51
|
+
@player = extract_player(@raw['prints'], @time)
|
49
52
|
@playernames << @player # just support one player atm
|
50
53
|
end
|
51
54
|
|
@@ -68,40 +71,71 @@ class DemoReaderDefrag
|
|
68
71
|
|
69
72
|
protected
|
70
73
|
|
74
|
+
def guessable_time(time)
|
75
|
+
time = time.sub(/^[0:\.]*/, "") # remove empty min, sec, etc
|
76
|
+
parts = time.split(/\.|:/).map(&:to_i)
|
77
|
+
|
78
|
+
format_str = case parts.size
|
79
|
+
when 3 then "%d:%02d:%03d"
|
80
|
+
when 2 then "%02d:%03d"
|
81
|
+
end
|
82
|
+
|
83
|
+
format_str % parts
|
84
|
+
end
|
85
|
+
|
71
86
|
# extract player from server prints
|
72
87
|
# supports only one player atm otherwise raises an exception
|
73
88
|
#
|
74
|
-
def extract_player(prints)
|
89
|
+
def extract_player(prints, time)
|
90
|
+
time = guessable_time(time)
|
91
|
+
|
75
92
|
players = prints.inject([]) do |arr,p|
|
76
|
-
arr << $1 if p =~ /^(.+)\^7 reached the finish line/
|
77
|
-
arr << $1 if p =~ /^Time performed by (.+)\^7
|
93
|
+
arr << $1 if p =~ /^(.+)\^7 reached the finish line in \^\d#{time}/
|
94
|
+
arr << $1 if p =~ /^Time performed by (.+)\^7 : \^\d#{time}/
|
78
95
|
arr
|
79
96
|
end
|
80
97
|
|
81
|
-
raise "
|
98
|
+
raise "No player was found." if players.empty?
|
99
|
+
raise "Not only one player was found #{players.inspect}." if players.size > 1
|
82
100
|
|
83
101
|
players.first
|
84
102
|
end
|
85
103
|
|
104
|
+
|
105
|
+
def extract_time_from_filename(filename)
|
106
|
+
$1 if File.basename(filename) =~ /(\d{2}\.\d{2}\.\d{3})/
|
107
|
+
end
|
108
|
+
|
86
109
|
# extract time from server prints
|
87
110
|
# supports only one time atm otherwise raises an exception
|
88
111
|
#
|
89
|
-
def extract_time(prints)
|
112
|
+
def extract_time(prints, time_hint)
|
90
113
|
times = prints.inject([]) do |arr,p|
|
91
|
-
arr << $1 if p =~ /(\^[0-9]+:[\^:0-9]+)/
|
114
|
+
arr << normalize_time(plain_text($1)) if p =~ /(\^[0-9]+:[\^:0-9]+)/
|
92
115
|
arr
|
93
116
|
end
|
94
117
|
|
95
|
-
raise "
|
118
|
+
raise "No time was found." if times.empty?
|
119
|
+
return times.first if times.one?
|
96
120
|
|
97
|
-
|
121
|
+
# multiple times found
|
122
|
+
# try to guess time by hint
|
123
|
+
#
|
124
|
+
time_hint = normalize_time(time_hint) if time_hint.present?
|
125
|
+
return time_hint if times.member?(time_hint)
|
98
126
|
|
99
|
-
|
100
|
-
"%02d:%02d.%03d" % time.split(":").map(&:to_i)
|
127
|
+
raise "Not only one time was found #{times.inspect}."
|
101
128
|
end
|
102
129
|
|
103
130
|
def plain_text(text)
|
104
131
|
text.gsub(/\^\d/, '')
|
105
132
|
end
|
133
|
+
|
134
|
+
def normalize_time(time_str)
|
135
|
+
parts = time_str.split(/\.|:/)
|
136
|
+
parts.unshift(0) if parts.size < 3
|
137
|
+
|
138
|
+
"%02d:%02d.%03d" % parts.map(&:to_i)
|
139
|
+
end
|
106
140
|
end
|
107
141
|
|
Binary file
|
@@ -15,7 +15,7 @@ class DemoReaderDefragDm68CpmTest < Test::Unit::TestCase
|
|
15
15
|
|
16
16
|
file, map, time, player = entry
|
17
17
|
|
18
|
-
define_method "
|
18
|
+
define_method "test_defrag_dm_#{version}_demo_#{file.gsub(/[^a-z_0-9]/, "_")}" do
|
19
19
|
demo = DemoReader.parse("test/fixtures/defrag/dm_#{version}/#{gamemode}/#{file}.dm_#{version}")
|
20
20
|
|
21
21
|
assert demo.valid
|
@@ -9,12 +9,13 @@ class DemoReaderDefragDm68Vq3Test < Test::Unit::TestCase
|
|
9
9
|
|
10
10
|
[
|
11
11
|
%w(runkull2_df.vq3_01.05.904_XunderBIRD.Germany runkull2 01:05.904 ^2XunderBIRD),
|
12
|
-
%w(un-dead029_df.vq3_00.16.912_uN-DeaD!WiNTeR.ru un-dead029 00:16.912 ^2uN-DeaD!WiNTeR)
|
12
|
+
%w(un-dead029_df.vq3_00.16.912_uN-DeaD!WiNTeR.ru un-dead029 00:16.912 ^2uN-DeaD!WiNTeR),
|
13
|
+
%w(cyfio-df_mdf.vq3_06.25.832_rlxmini.CountryHere cyfio-df 06:25.832 r^1l^7x^0|^7m^1i^7n^1i)
|
13
14
|
].each do |entry|
|
14
15
|
|
15
16
|
file, map, time, player = entry
|
16
17
|
|
17
|
-
define_method "
|
18
|
+
define_method "test_defrag_dm_#{version}_demo_#{file.gsub(/[^a-z_0-9]/, "_")}" do
|
18
19
|
demo = DemoReader.parse("test/fixtures/defrag/dm_#{version}/#{gamemode}/#{file}.dm_#{version}")
|
19
20
|
|
20
21
|
assert demo.valid
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: demo-reader
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 31
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 4
|
10
|
+
version: 0.2.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- aekym
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-12-19 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -53,6 +53,7 @@ files:
|
|
53
53
|
- lib/demo_reader_warsow.rb
|
54
54
|
- test/fixtures/defrag/dm_68/cpm/pornchronostar_mdf.cpm_00.49.216_tyaz.germany.dm_68
|
55
55
|
- test/fixtures/defrag/dm_68/cpm/puremotion_df.cpm_00.10.600_eS-Rody.russia.dm_68
|
56
|
+
- test/fixtures/defrag/dm_68/vq3/cyfio-df_mdf.vq3_06.25.832_rlxmini.CountryHere.dm_68
|
56
57
|
- test/fixtures/defrag/dm_68/vq3/runkull2_df.vq3_01.05.904_XunderBIRD.Germany.dm_68
|
57
58
|
- test/fixtures/defrag/dm_68/vq3/un-dead029_df.vq3_00.16.912_uN-DeaD!WiNTeR.ru.dm_68
|
58
59
|
- test/fixtures/warsow/wd10/racesow_0.42.b2/dinirun2_racesow_0.42.b2.wd10
|