d3_mpq 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/bindata_ext/mod_code.rb +3 -2
- data/lib/core_ext/min_max.rb +2 -0
- data/lib/d3_mpq/commands.rb +2 -0
- data/lib/d3_mpq/core_data/actor.rb +6 -20
- data/lib/d3_mpq/core_data/game_balance/affix_list.rb +3 -3
- data/lib/d3_mpq/core_data/game_balance/items.rb +10 -8
- data/lib/d3_mpq/csv_generator.rb +2 -0
- data/lib/d3_mpq/csv_generator/affix_list.rb +41 -0
- data/lib/d3_mpq/csv_generator/items.rb +64 -0
- data/lib/d3_mpq/version.rb +1 -1
- data/lib/d3_mpq/version.rb~ +1 -1
- data/spec/core_ext/min_max_spec.rb +7 -0
- data/spec/integration/actor_spec.rb +12 -1
- data/spec/unit/core_data/actor_spec.rb +17 -17
- data/spec/unit/csv_generator/affix_list_spec.rb +11 -0
- data/spec/unit/csv_generator/item_spec.rb +18 -0
- data/spec/unit/csv_generator/item_types_spec.rb +11 -0
- metadata +21 -13
data/lib/bindata_ext/mod_code.rb
CHANGED
@@ -68,11 +68,11 @@ class ModCode < BinData::Record
|
|
68
68
|
end
|
69
69
|
|
70
70
|
def min
|
71
|
-
@value.min
|
71
|
+
@value ? @value.min : nil
|
72
72
|
end
|
73
73
|
|
74
74
|
def max
|
75
|
-
@value.max
|
75
|
+
@value ? @value.max : nil
|
76
76
|
end
|
77
77
|
|
78
78
|
def push(item)
|
@@ -98,6 +98,7 @@ class ModCode < BinData::Record
|
|
98
98
|
# Lets go
|
99
99
|
def parse
|
100
100
|
return @value if @value
|
101
|
+
return nil if @data.empty?
|
101
102
|
|
102
103
|
next_op = true
|
103
104
|
@data.each_with_index do |dword, index|
|
data/lib/core_ext/min_max.rb
CHANGED
data/lib/d3_mpq/commands.rb
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
module D3MPQ::CoreData
|
2
2
|
class Actor < D3MPQ::MPQ
|
3
|
-
uint32 :actor_id
|
3
|
+
uint32 :actor_id
|
4
4
|
|
5
|
-
unknown :length => 21
|
5
|
+
unknown :length => 21
|
6
6
|
|
7
7
|
hide :var_data_offset, :var_data_length
|
8
8
|
uint32 :var_data_offset, :check_value => 864
|
9
9
|
uint32 :var_data_length
|
10
|
-
unknown :length => 13
|
10
|
+
unknown :length => 13
|
11
11
|
|
12
|
-
string :name, :length => 64, :trim_padding => true
|
12
|
+
string :name, :length => 64, :trim_padding => true
|
13
13
|
|
14
|
-
unknown :length =>
|
14
|
+
unknown :length => 143
|
15
15
|
|
16
|
-
# zeroes
|
17
|
-
uint32 :image_hash_before
|
18
16
|
uint32 :image_hash_dh_male
|
19
17
|
uint32 :image_hash_dh_female
|
20
18
|
uint32 :image_hash_barb_male
|
@@ -25,23 +23,11 @@ module D3MPQ::CoreData
|
|
25
23
|
uint32 :image_hash_wd_female
|
26
24
|
uint32 :image_hash_monk_male
|
27
25
|
uint32 :image_hash_monk_female
|
28
|
-
uint32 :image_hash_after
|
29
26
|
|
30
|
-
unknown :length =>
|
31
|
-
|
32
|
-
# array :var_data,
|
33
|
-
# :initial_length => lambda { var_data_length / 4 },
|
34
|
-
# :adjust_offset => lambda { var_data_offset + 16 } do
|
35
|
-
# uint32
|
36
|
-
# end
|
37
|
-
|
38
|
-
# hide :var_data
|
39
|
-
# string :var_data, :length => lambda { var_data_length / 4 },
|
40
|
-
# :adjust_offset => lambda { var_data_offset + 16 }
|
27
|
+
unknown :length => 10
|
41
28
|
|
42
29
|
hide :rest
|
43
30
|
rest :rest
|
44
|
-
|
45
31
|
end
|
46
32
|
end
|
47
33
|
|
@@ -18,13 +18,13 @@ module D3MPQ::CoreData::GameBalance
|
|
18
18
|
uint32 :u03
|
19
19
|
uint32 :u04
|
20
20
|
uint32 :u05
|
21
|
-
uint32 :
|
22
|
-
uint32 :
|
21
|
+
uint32 :param1
|
22
|
+
uint32 :param2
|
23
23
|
uint32 :rare_name_prefix_id
|
24
24
|
uint32 :rare_name_suffix_id
|
25
25
|
uint32 :group_hash
|
26
26
|
uint32 :group_hash2
|
27
|
-
uint32 :
|
27
|
+
uint32 :class_id
|
28
28
|
uint32 :resource_type_hash
|
29
29
|
uint32 :u06
|
30
30
|
|
@@ -41,7 +41,7 @@ module D3MPQ::CoreData::GameBalance
|
|
41
41
|
uint32 :durability_min
|
42
42
|
uint32 :durability_delta
|
43
43
|
uint32 :base_item_hash
|
44
|
-
uint32 :
|
44
|
+
uint32 :setitem_bonus
|
45
45
|
uint32 :salvage_common
|
46
46
|
uint32 :salvage_magic
|
47
47
|
uint32 :salvage_rare
|
@@ -59,15 +59,15 @@ module D3MPQ::CoreData::GameBalance
|
|
59
59
|
zeroes :length => 0x15
|
60
60
|
|
61
61
|
# Armor
|
62
|
-
float :
|
63
|
-
float :
|
62
|
+
float :armor_min
|
63
|
+
float :armor_delta
|
64
64
|
zeroes :length => 0x2A
|
65
65
|
|
66
66
|
# Speed
|
67
67
|
float :attacks_per_second
|
68
68
|
zeroes :length => 21
|
69
|
-
float :
|
70
|
-
float :
|
69
|
+
float :damage_mod_min
|
70
|
+
float :damage_mod_delta
|
71
71
|
zeroes :length => 26
|
72
72
|
|
73
73
|
# Unknown
|
@@ -94,22 +94,24 @@ module D3MPQ::CoreData::GameBalance
|
|
94
94
|
end
|
95
95
|
|
96
96
|
ffs :length => 3
|
97
|
-
uint32 :
|
97
|
+
uint32 :enhancement
|
98
98
|
|
99
99
|
# Legendary Affixes
|
100
|
+
uint32 :affix0_id
|
100
101
|
uint32 :affix1_id
|
101
102
|
uint32 :affix2_id
|
102
103
|
uint32 :affix3_id
|
103
104
|
uint32 :affix4_id
|
104
105
|
uint32 :affix5_id
|
105
|
-
|
106
|
+
uint32 :affix0_level
|
106
107
|
uint32 :affix1_level
|
107
108
|
uint32 :affix2_level
|
108
109
|
uint32 :affix3_level
|
109
110
|
uint32 :affix4_level
|
110
111
|
uint32 :affix5_level
|
111
112
|
|
112
|
-
|
113
|
+
|
114
|
+
zeroes :length => 6
|
113
115
|
|
114
116
|
uint32 :gem_type
|
115
117
|
uint32 :crafting_mat_tier
|
data/lib/d3_mpq/csv_generator.rb
CHANGED
@@ -3,7 +3,9 @@ module D3MPQ
|
|
3
3
|
require 'd3_mpq/csv_generator/base'
|
4
4
|
|
5
5
|
require 'd3_mpq/csv_generator/actor'
|
6
|
+
require 'd3_mpq/csv_generator/affix_list'
|
6
7
|
require 'd3_mpq/csv_generator/item_types'
|
8
|
+
require 'd3_mpq/csv_generator/items'
|
7
9
|
require 'd3_mpq/csv_generator/string_list'
|
8
10
|
end
|
9
11
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module D3MPQ::CSVGenerator
|
2
|
+
class AffixList < Base
|
3
|
+
MPQ_READER = D3MPQ::CoreData::GameBalance::AffixList
|
4
|
+
|
5
|
+
map = {
|
6
|
+
:name => :name,
|
7
|
+
:hash => Proc.new { |subject| subject.name.to_d3_hash },
|
8
|
+
:lvl => :alvl,
|
9
|
+
:supmask => :sup_mask,
|
10
|
+
:param1 => :param1,
|
11
|
+
:param2 => :param2,
|
12
|
+
:rare_prefix_fileid => :rare_name_prefix_id,
|
13
|
+
:rate_suffix_fileid => :rare_name_suffix_id,
|
14
|
+
:parent_hash => :group_hash,
|
15
|
+
:parent_hash2 => :group_hash2,
|
16
|
+
:class_id => :class_id,
|
17
|
+
:resource_hash => :resource_type_hash,
|
18
|
+
:quality_mask => :quality_mask,
|
19
|
+
:socket_mask => :socket_mask,
|
20
|
+
:primary_group_hash => :primary_group_hash
|
21
|
+
}
|
22
|
+
|
23
|
+
32.times do |i|
|
24
|
+
map["itemgroup_hash#{i}".intern] = "igh#{i}".intern
|
25
|
+
end
|
26
|
+
|
27
|
+
4.times do |i|
|
28
|
+
m = "modcode#{i}"
|
29
|
+
map["#{m}_mod_id".intern] = Proc.new { |subject| subject.mod_codes[i].mod_code }
|
30
|
+
map["#{m}_param1".intern] = Proc.new { |subject| subject.mod_codes[i].mod_param1 }
|
31
|
+
map["#{m}_param2".intern] = Proc.new { |subject| subject.mod_codes[i].mod_param2 }
|
32
|
+
map["#{m}_param3".intern] = Proc.new { |subject| subject.mod_codes[i].mod_param3 }
|
33
|
+
map["#{m}_opcode".intern] = Proc.new { |subject| subject.mod_codes[i].trace.join("|") }
|
34
|
+
map["#{m}_value_min".intern] = Proc.new { |subject| subject.mod_codes[i].min }
|
35
|
+
map["#{m}_value_max".intern] = Proc.new { |subject| subject.mod_codes[i].max }
|
36
|
+
end
|
37
|
+
|
38
|
+
map_to_csv(map)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module D3MPQ::CSVGenerator
|
2
|
+
class Items < Base
|
3
|
+
MPQ_READER = D3MPQ::CoreData::GameBalance::Items
|
4
|
+
|
5
|
+
map = {
|
6
|
+
:name => :name,
|
7
|
+
:hash => Proc.new { |subject| subject.name.to_d3_hash },
|
8
|
+
:actor_id => :actor_id,
|
9
|
+
:item_type_hash => :item_type_hash,
|
10
|
+
:lvl => :item_level,
|
11
|
+
:lvl2 => :ilvl2,
|
12
|
+
:random_affixes => :num_random_affixes,
|
13
|
+
:max_sockets => :num_sockets,
|
14
|
+
:max_stacksize => :stack_size,
|
15
|
+
:gold_price => :gold_value,
|
16
|
+
:clvl => :required_level,
|
17
|
+
:durability_min => :durability_min,
|
18
|
+
:durability_delta => :durability_delta,
|
19
|
+
:baseitem_hash => :base_item_hash,
|
20
|
+
:setitem_bonus => :setitem_bonus,
|
21
|
+
:salvage_common => :salvage_common,
|
22
|
+
:salvage_magic => :salvage_magic,
|
23
|
+
:salvage_rare => :salvage_rare,
|
24
|
+
:rare_prefix_fileid => :rare_group_prefix_id,
|
25
|
+
:rare_suffix_fileid => :rare_group_suffix_id,
|
26
|
+
:damage_min => :weapong_damage_min,
|
27
|
+
:damage_delta => :weapong_damage_delta,
|
28
|
+
:armor_min => :armor_min,
|
29
|
+
:armor_delta => :armor_delta,
|
30
|
+
:weapon_speed => :attacks_per_second,
|
31
|
+
:damagemod_min => :damage_mod_min,
|
32
|
+
:damagemod_delta => :damage_mod_delta,
|
33
|
+
:item_quality => :item_quality,
|
34
|
+
:enhancement => :enhancement,
|
35
|
+
:gem_type => :gem_type,
|
36
|
+
:craftmat_tier => :crafting_mat_tier,
|
37
|
+
:craftmat_rarity => :crafting_mat_rarity
|
38
|
+
}
|
39
|
+
|
40
|
+
7.times do |i|
|
41
|
+
t = "teaches#{i}".intern
|
42
|
+
map[t] = t
|
43
|
+
end
|
44
|
+
|
45
|
+
6.times do |i|
|
46
|
+
map["affixgroup#{i}".intern] = "affix#{i}_id".intern
|
47
|
+
map["affixlevel#{i}".intern] = "affix#{i}_level".intern
|
48
|
+
end
|
49
|
+
|
50
|
+
16.times do |i|
|
51
|
+
m = "modcode#{i}"
|
52
|
+
map["#{m}_mod_id".intern] = Proc.new { |subject| subject.mod_codes[i].mod_code }
|
53
|
+
map["#{m}_param1".intern] = Proc.new { |subject| subject.mod_codes[i].mod_param1 }
|
54
|
+
map["#{m}_param2".intern] = Proc.new { |subject| subject.mod_codes[i].mod_param2 }
|
55
|
+
map["#{m}_param3".intern] = Proc.new { |subject| subject.mod_codes[i].mod_param3 }
|
56
|
+
map["#{m}_opcode".intern] = Proc.new { |subject| subject.mod_codes[i].trace.join("|") }
|
57
|
+
map["#{m}_value_min".intern] = Proc.new { |subject| subject.mod_codes[i].min }
|
58
|
+
map["#{m}_value_max".intern] = Proc.new { |subject| subject.mod_codes[i].max }
|
59
|
+
end
|
60
|
+
|
61
|
+
map_to_csv(map)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
data/lib/d3_mpq/version.rb
CHANGED
data/lib/d3_mpq/version.rb~
CHANGED
@@ -57,6 +57,13 @@ describe MinMax do
|
|
57
57
|
describe "#/" do
|
58
58
|
specify { (a / b).min.should == 1.to_f/4 }
|
59
59
|
specify { (a / b).max.should == 2.to_f/3 }
|
60
|
+
|
61
|
+
context "dividing by possible zero value" do
|
62
|
+
let(:a) { MinMax.new(1.0, 3.0) }
|
63
|
+
let(:b) { MinMax.new(-4.0, 4.0) }
|
64
|
+
|
65
|
+
specify { expect { a / b }.to raise_error }
|
66
|
+
end
|
60
67
|
pending "Add TestCases for edges"
|
61
68
|
end
|
62
69
|
end
|
@@ -17,7 +17,18 @@ describe D3MPQ::CoreData::Actor, :integration => true do
|
|
17
17
|
# dir.entries.sort.each do |f|
|
18
18
|
# next if f == "." || f == ".."
|
19
19
|
|
20
|
-
|
20
|
+
actors.delete_if do |a|
|
21
|
+
temp_file = File.new(a)
|
22
|
+
size = temp_file.size
|
23
|
+
temp_file.close
|
24
|
+
|
25
|
+
if size == 0
|
26
|
+
warn "[SKIP] #{a}"
|
27
|
+
true
|
28
|
+
else
|
29
|
+
false
|
30
|
+
end
|
31
|
+
end
|
21
32
|
# file = File.join(dir, f)
|
22
33
|
|
23
34
|
# temp_file = File.new(file)
|
@@ -1,22 +1,22 @@
|
|
1
|
-
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
describe D3MPQ::CoreData::Actor, :broken => true do
|
4
|
+
let(:io) { File.open("spec/fixtures/CoreData/Actor/DH_elementalArrow_iceProjectile.acr") }
|
5
|
+
# let(:io) { File.open("spec/fixtures/CoreData/GameBalance/Items_Quests_Beta.gam") }
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
## end
|
11
|
-
|
12
|
-
# specify do
|
13
|
-
# BinData::trace_reading { subject.read(io) }
|
14
|
-
## subject.var_data_length.should == 0
|
15
|
-
# subject.rest.length.should == 0
|
16
|
-
# true.should be_false
|
7
|
+
# before(:all) do
|
8
|
+
# subject.read(io)
|
9
|
+
## BinData::trace_reading { subject.read(io) }
|
17
10
|
# end
|
18
11
|
|
19
|
-
|
20
|
-
|
21
|
-
#
|
12
|
+
specify do
|
13
|
+
BinData::trace_reading { subject.read(io) }
|
14
|
+
# subject.var_data_length.should == 0
|
15
|
+
subject.rest.length.should == 0
|
16
|
+
true.should be_false
|
17
|
+
end
|
18
|
+
|
19
|
+
# its(:variable_content) { subject.size.should_not == 0 }
|
20
|
+
# its(:rest) { should == "" }
|
21
|
+
end
|
22
22
|
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe D3MPQ::CSVGenerator::Items do
|
4
|
+
describe "#write" do
|
5
|
+
[
|
6
|
+
"Items_Armor.gam",
|
7
|
+
"Items_Weapons.gam",
|
8
|
+
"Items_Other.gam",
|
9
|
+
"Items_Quests_Beta.gam"
|
10
|
+
].each do |file_name|
|
11
|
+
context "when called with: Items_Armor.gam" do
|
12
|
+
let(:input) { "spec/fixtures/CoreData/GameBalance/#{file_name}" }
|
13
|
+
specify { subject.files = input; subject.write }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: d3_mpq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-05-12 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bindata
|
16
|
-
requirement: &
|
16
|
+
requirement: &70636020 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70636020
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: nokogiri
|
27
|
-
requirement: &
|
27
|
+
requirement: &70635710 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70635710
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rspec
|
38
|
-
requirement: &
|
38
|
+
requirement: &70635330 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70635330
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: guard
|
49
|
-
requirement: &
|
49
|
+
requirement: &70635050 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70635050
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: guard-rspec
|
60
|
-
requirement: &
|
60
|
+
requirement: &70634640 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70634640
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: libnotify
|
71
|
-
requirement: &
|
71
|
+
requirement: &70634350 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,7 +76,7 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70634350
|
80
80
|
description: Parsing data out of Diablo 3.
|
81
81
|
email:
|
82
82
|
- deradon87@gmail.com
|
@@ -118,7 +118,9 @@ files:
|
|
118
118
|
- lib/d3_mpq/csv_generator/item_types.rb
|
119
119
|
- lib/d3_mpq/csv_generator/string_list.rb
|
120
120
|
- lib/d3_mpq/csv_generator/base.rb
|
121
|
+
- lib/d3_mpq/csv_generator/affix_list.rb
|
121
122
|
- lib/d3_mpq/csv_generator/actor.rb
|
123
|
+
- lib/d3_mpq/csv_generator/items.rb
|
122
124
|
- lib/d3_mpq/version.rb~
|
123
125
|
- lib/bindata_ext/dsl.rb
|
124
126
|
- lib/bindata_ext/mod_codes.rb
|
@@ -6463,6 +6465,9 @@ files:
|
|
6463
6465
|
- spec/unit/core_data/game_balance/item_enhancements_spec.rb
|
6464
6466
|
- spec/unit/bindata_ext/mod_code_spec.rb
|
6465
6467
|
- spec/unit/string_list_spec.rb
|
6468
|
+
- spec/unit/csv_generator/affix_list_spec.rb
|
6469
|
+
- spec/unit/csv_generator/item_types_spec.rb
|
6470
|
+
- spec/unit/csv_generator/item_spec.rb
|
6466
6471
|
- spec/unit/csv_generator/csv_generator_spec.rb
|
6467
6472
|
- spec/unit/analyzer_spec.rb
|
6468
6473
|
- spec/unit/attributes_spec.rb
|
@@ -12827,6 +12832,9 @@ test_files:
|
|
12827
12832
|
- spec/unit/core_data/game_balance/item_enhancements_spec.rb
|
12828
12833
|
- spec/unit/bindata_ext/mod_code_spec.rb
|
12829
12834
|
- spec/unit/string_list_spec.rb
|
12835
|
+
- spec/unit/csv_generator/affix_list_spec.rb
|
12836
|
+
- spec/unit/csv_generator/item_types_spec.rb
|
12837
|
+
- spec/unit/csv_generator/item_spec.rb
|
12830
12838
|
- spec/unit/csv_generator/csv_generator_spec.rb
|
12831
12839
|
- spec/unit/analyzer_spec.rb
|
12832
12840
|
- spec/unit/attributes_spec.rb
|