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.
@@ -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|
@@ -23,6 +23,8 @@ class MinMax
23
23
 
24
24
  # HACK: use a more clever solution
25
25
  def /(oth)
26
+ raise "We can not divide by a range of: #{oth.min} to #{oth.max}" if (oth.min * oth.max) < 0
27
+
26
28
  v = possible_values(self, oth){ |a, b| a / b }
27
29
  MinMax.new(v.min, v.max)
28
30
  end
@@ -82,6 +82,8 @@ You need to provide the GeneratorClass:
82
82
  Example: d3_mpq --csv-input extracted_mpqs/StringList/ csv StringList
83
83
 
84
84
  * Actor
85
+ * AffixList
86
+ * Items
85
87
  * ItemTypes
86
88
  * StringList
87
89
 
@@ -1,20 +1,18 @@
1
1
  module D3MPQ::CoreData
2
2
  class Actor < D3MPQ::MPQ
3
- uint32 :actor_id#0x014 DWord appMpqId; // The MPQ Id of the corresponding Appearance file
3
+ uint32 :actor_id
4
4
 
5
- unknown :length => 21#0x018 DWord unknown2[16]; // ???
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#0x060 DWord unknown3[13]; // ???
10
+ unknown :length => 13
11
11
 
12
- string :name, :length => 64, :trim_padding => true#0x094 char string[64]; // string
12
+ string :name, :length => 64, :trim_padding => true
13
13
 
14
- unknown :length => 133#0x0D4 DWord unknown4[143]; // ???
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 => 17# 0x338 DWord unknown4[10]; // could be related to class/gender?
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 :p01
22
- uint32 :p02
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 :ressource_or_class
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 :set_item_bonusses
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 :armor_minimum
63
- float :armor_variable
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 :min_damage_mod
70
- float :max_damage_mod
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 :enchants
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
- ffs
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
- zeroes :length => 7
113
+
114
+ zeroes :length => 6
113
115
 
114
116
  uint32 :gem_type
115
117
  uint32 :crafting_mat_tier
@@ -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
+
@@ -1,4 +1,4 @@
1
1
  module D3MPQ
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7"
3
3
  end
4
4
 
@@ -1,4 +1,4 @@
1
1
  module D3MPQ
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
4
4
 
@@ -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
- #require 'spec_helper'
1
+ require 'spec_helper'
2
2
 
3
- #describe D3MPQ::CoreData::Actor 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") }
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
- ## before(:all) do
8
- ## subject.read(io)
9
- ### BinData::trace_reading { subject.read(io) }
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
- ## its(:variable_content) { subject.size.should_not == 0 }
20
- ## its(:rest) { should == "" }
21
- #end
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,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe D3MPQ::CSVGenerator::AffixList do
4
+ let(:dir) { "spec/fixtures/CoreData/GameBalance/AffixList.gam" }
5
+
6
+ specify "#write" do
7
+ subject.files = dir
8
+ subject.write
9
+ end
10
+ end
11
+
@@ -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
+
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe D3MPQ::CSVGenerator::ItemTypes do
4
+ let(:dir) { "spec/fixtures/CoreData/GameBalance/ItemTypes.gam" }
5
+
6
+ specify "#write" do
7
+ subject.files = dir
8
+ subject.write
9
+ end
10
+ end
11
+
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.6
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: &68997680 !ruby/object:Gem::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: *68997680
24
+ version_requirements: *70636020
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: nokogiri
27
- requirement: &68952190 !ruby/object:Gem::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: *68952190
35
+ version_requirements: *70635710
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rspec
38
- requirement: &68951920 !ruby/object:Gem::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: *68951920
46
+ version_requirements: *70635330
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: guard
49
- requirement: &68951540 !ruby/object:Gem::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: *68951540
57
+ version_requirements: *70635050
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: guard-rspec
60
- requirement: &68951070 !ruby/object:Gem::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: *68951070
68
+ version_requirements: *70634640
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: libnotify
71
- requirement: &68950820 !ruby/object:Gem::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: *68950820
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