d3_mpq 0.0.6 → 0.0.7

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.
@@ -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