wowr 0.2.2 → 0.3.0
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/README +6 -34
- data/changelog.txt +31 -0
- data/lib/wowr.rb +338 -308
- data/lib/wowr/arena_team.rb +80 -0
- data/lib/wowr/character.rb +821 -0
- data/lib/wowr/exceptions.rb +75 -10
- data/lib/wowr/extensions.rb +63 -1
- data/lib/wowr/guild.rb +85 -0
- data/lib/wowr/item.rb +616 -0
- metadata +8 -3
- data/lib/wowr/classes.rb +0 -1345
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wowr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Humphreys
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-06-05 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -29,12 +29,17 @@ extensions: []
|
|
29
29
|
|
30
30
|
extra_rdoc_files:
|
31
31
|
- README
|
32
|
+
- changelog.txt
|
32
33
|
files:
|
33
34
|
- lib/wowr.rb
|
34
|
-
- lib/wowr/
|
35
|
+
- lib/wowr/arena_team.rb
|
36
|
+
- lib/wowr/character.rb
|
37
|
+
- lib/wowr/guild.rb
|
38
|
+
- lib/wowr/item.rb
|
35
39
|
- lib/wowr/exceptions.rb
|
36
40
|
- lib/wowr/extensions.rb
|
37
41
|
- README
|
42
|
+
- changelog.txt
|
38
43
|
has_rdoc: true
|
39
44
|
homepage: http://wowr.rubyforge.org/
|
40
45
|
post_install_message:
|
data/lib/wowr/classes.rb
DELETED
@@ -1,1345 +0,0 @@
|
|
1
|
-
# TODO: Item sources - Vendors
|
2
|
-
# sourceType.vendor
|
3
|
-
# sourceType.questReward
|
4
|
-
# sourceType.createdBySpell
|
5
|
-
|
6
|
-
# TODO: Split up classes depending on subject? Character, Item, Guild, ArenaTeam
|
7
|
-
|
8
|
-
|
9
|
-
# Wowr was written by Ben Humphreys!
|
10
|
-
# http://wowr.benhumphreys.co.uk/
|
11
|
-
module Wowr
|
12
|
-
module Classes
|
13
|
-
|
14
|
-
# Most basic
|
15
|
-
# Composed of an ItemInfo and
|
16
|
-
# Needs to be consolidated with ItemInfo and other stuff
|
17
|
-
# to be a parent class that they extend?
|
18
|
-
class Item
|
19
|
-
attr_reader :id, :name, :icon
|
20
|
-
alias_method :item_id, :id
|
21
|
-
|
22
|
-
def initialize(elem)
|
23
|
-
@id = elem[:id].to_i
|
24
|
-
@name = elem[:name]
|
25
|
-
@icon = elem[:icon]
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
|
30
|
-
# Short character info, used in guild lists etc.
|
31
|
-
# Note that the way that searches and character listings within guilds works,
|
32
|
-
# there can be a variable amount of information filled in within the class.
|
33
|
-
# Guild listings and search results contain a smaller amount of information than
|
34
|
-
# single queries
|
35
|
-
class Character
|
36
|
-
attr_reader :name, :level, :url, :rank,
|
37
|
-
:klass, :klass_id,
|
38
|
-
:gender, :gender_id,
|
39
|
-
:race, :race_id,
|
40
|
-
:guild, :guild_id, :guild_url,
|
41
|
-
:battle_group, :last_login,
|
42
|
-
:relevance, :search_rank,
|
43
|
-
|
44
|
-
:season_games_played, :season_games_won, :team_rank, :contribution # From ArenaTeam info
|
45
|
-
|
46
|
-
def initialize(elem)
|
47
|
-
@name = elem[:name]
|
48
|
-
@level = elem[:level].to_i
|
49
|
-
@url = elem[:url] || elem[:charUrl]
|
50
|
-
@rank = elem[:rank].to_i
|
51
|
-
|
52
|
-
@klass = elem[:class]
|
53
|
-
@klass_id = elem[:classId].to_i
|
54
|
-
|
55
|
-
@gender = elem[:gender]
|
56
|
-
@gender_id = elem[:genderId].to_i
|
57
|
-
|
58
|
-
@race = elem[:race]
|
59
|
-
@race_id = elem[:raceId].to_i
|
60
|
-
|
61
|
-
@guild = elem[:guild] == "" ? nil : elem[:guild]
|
62
|
-
@guild_id = elem[:guildId].to_i == 0 ? nil : elem[:guildId].to_i
|
63
|
-
@guild_url = elem[:guildUrl] == "" ? nil : elem[:guildUrl]
|
64
|
-
|
65
|
-
@battle_group = elem[:battleGroup] == "" ? nil : elem[:battleGroup]
|
66
|
-
@battle_group_id = elem[:battleGroupId].to_i
|
67
|
-
|
68
|
-
@relevance = elem[:relevance].to_i
|
69
|
-
@search_rank = elem[:searchRank].to_i
|
70
|
-
|
71
|
-
# Incoming string is 2007-02-24 20:33:04.0, parse to datetime
|
72
|
-
#@last_login = elem[:lastLoginDate] == "" ? nil : DateTime.parse(elem[:lastLoginDate])
|
73
|
-
@last_login = elem[:lastLoginDate] == "" ? nil : elem[:lastLoginDate]
|
74
|
-
|
75
|
-
# From ArenaTeam info, can be blank on normal requests
|
76
|
-
#<character battleGroup="" charUrl="r=Draenor&n=Lothaar" class="Paladin" classId="2"
|
77
|
-
# contribution="1602" gamesPlayed="10" gamesWon="7" gender="Male" genderId="0"
|
78
|
-
# guild="Passion" guildId="36659" guildUrl="r=Draenor&n=Passion&p=1" name="Lothaar"
|
79
|
-
# race="Human" raceId="1" seasonGamesPlayed="20" seasonGamesWon="13" teamRank="1"/>
|
80
|
-
@season_games_played = elem[:seasonGamesPlayed] == "" ? nil : elem[:seasonGamesPlayed].to_i
|
81
|
-
@season_games_won = elem[:seasonGamesWon] == "" ? nil : elem[:seasonGamesWon].to_i
|
82
|
-
@team_rank = elem[:teamRank] == "" ? nil : elem[:teamRank].to_i
|
83
|
-
@contribution = elem[:contribution] == "" ? nil : elem[:contribution].to_i
|
84
|
-
#@char_url = elem[:charUrl] # TODO: Merge with URL?
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
# Full character details
|
91
|
-
# uses characterInfo element
|
92
|
-
# NEEDS TO EXTEND BASE CHARACTER THING
|
93
|
-
class CharacterSheet
|
94
|
-
|
95
|
-
# character_info
|
96
|
-
attr_reader :name, :level, :char_url, :title,
|
97
|
-
:gender, :gender_id,
|
98
|
-
:race, :race_id,
|
99
|
-
:klass, :klass_id,
|
100
|
-
:faction, :faction_id,
|
101
|
-
:guild, :guild_url,
|
102
|
-
:realm,
|
103
|
-
:battle_group,
|
104
|
-
:arena_teams,
|
105
|
-
:last_modified
|
106
|
-
|
107
|
-
# character_tab
|
108
|
-
attr_reader :health, :second_bar,
|
109
|
-
:strength, :agility, :stamina, :intellect, :spirit
|
110
|
-
alias_method :str, :strength
|
111
|
-
alias_method :agi, :agility
|
112
|
-
alias_method :sta, :stamina
|
113
|
-
alias_method :int, :intellect
|
114
|
-
alias_method :spi, :spirit
|
115
|
-
|
116
|
-
attr_reader :title,
|
117
|
-
:melee, :ranged, :spell,
|
118
|
-
:defenses, :resistances,
|
119
|
-
:talent_spec, :pvp,
|
120
|
-
:professions,
|
121
|
-
:items,
|
122
|
-
:buffs, :debuffs
|
123
|
-
|
124
|
-
# It's made up of two parts
|
125
|
-
# Don't care about battlegroups yet
|
126
|
-
# I don't think I can call stuff from the constructor?
|
127
|
-
def initialize(elem)
|
128
|
-
character_info(elem%'character')
|
129
|
-
character_tab(elem%'characterTab')
|
130
|
-
end
|
131
|
-
|
132
|
-
# <character
|
133
|
-
# battleGroup="Conviction"
|
134
|
-
# charUrl="r=Genjuros&n=Jonlok"
|
135
|
-
# class="Warlock"
|
136
|
-
# classId="9"
|
137
|
-
# faction="Horde"
|
138
|
-
# factionId="1"
|
139
|
-
# gender="Male"
|
140
|
-
# genderId="0"
|
141
|
-
# guildName=""
|
142
|
-
# lastModified="12 February 2008"
|
143
|
-
# level="41"
|
144
|
-
# name="Jonlok"
|
145
|
-
# prefix=""
|
146
|
-
# race="Orc"
|
147
|
-
# raceId="2"
|
148
|
-
# realm="Genjuros"
|
149
|
-
# suffix=""/>
|
150
|
-
def character_info(elem)
|
151
|
-
# basic info
|
152
|
-
@name = elem[:name]
|
153
|
-
@level = elem[:level].to_i
|
154
|
-
@char_url = elem[:charUrl]
|
155
|
-
|
156
|
-
@klass = elem[:class]
|
157
|
-
@klass_id = elem[:classId].to_i
|
158
|
-
|
159
|
-
@gender = elem[:gender]
|
160
|
-
@gender_id = elem[:genderId].to_i
|
161
|
-
|
162
|
-
@race = elem[:race]
|
163
|
-
@race_id = elem[:raceId].to_i
|
164
|
-
|
165
|
-
@faction = elem[:faction]
|
166
|
-
@faction_id = elem[:factionId].to_i
|
167
|
-
|
168
|
-
@guild = elem[:guildName] == "" ? nil : elem[:guildName]
|
169
|
-
@guild_url = elem[:guildUrl] == "" ? nil : elem[:guildUrl]
|
170
|
-
|
171
|
-
@prefix = elem[:prefix]
|
172
|
-
@suffix = elem[:suffix]
|
173
|
-
|
174
|
-
@realm = elem[:realm]
|
175
|
-
|
176
|
-
@battle_group = elem[:battleGroup]
|
177
|
-
|
178
|
-
# format is February 11, 2008
|
179
|
-
# except when it's korean, and then it's 2008년 5월 11일 (일)
|
180
|
-
# tw is 2008年5月11日 (2008年5月11日)
|
181
|
-
# TODO: Datetime doesn't parse other languages nicely
|
182
|
-
# Until then, just save it as a string
|
183
|
-
begin
|
184
|
-
@last_modified = elem[:lastModified] == "" ? nil : DateTime.parse(elem[:lastModified])
|
185
|
-
rescue
|
186
|
-
@last_modified = elem[:lastModified] == "" ? nil : elem[:lastModified]
|
187
|
-
end
|
188
|
-
#@last_modified = elem[:lastModified]#.to_time
|
189
|
-
|
190
|
-
@arena_teams = []
|
191
|
-
(elem/:arenaTeam).each do |arena_team|
|
192
|
-
@arena_teams << ArenaTeam.new(arena_team)
|
193
|
-
end
|
194
|
-
|
195
|
-
end
|
196
|
-
|
197
|
-
def character_tab(elem)
|
198
|
-
|
199
|
-
# <title value=""/>
|
200
|
-
@title = (elem%'title')[:value] == "" ? nil : (elem%'title')[:value]
|
201
|
-
#@known_titles = <knownTitles/>
|
202
|
-
|
203
|
-
@health = (elem%'characterBars'%'health')[:effective].to_i
|
204
|
-
@second_bar = SecondBar.new(elem%'characterBars'%'secondBar')
|
205
|
-
|
206
|
-
# base stats
|
207
|
-
@strength = Strength.new(elem%'baseStats'%'strength')
|
208
|
-
@agility = Agility.new(elem%'baseStats'%'agility')
|
209
|
-
@stamina = Stamina.new(elem%'baseStats'%'stamina')
|
210
|
-
@intellect = Intellect.new(elem%'baseStats'%'intellect')
|
211
|
-
@spirit = Spirit.new(elem%'baseStats'%'spirit')
|
212
|
-
|
213
|
-
# damage stuff
|
214
|
-
@melee = Melee.new(elem%'melee')
|
215
|
-
@ranged = Ranged.new(elem%'ranged')
|
216
|
-
@spell = Spell.new(elem.at(' > spell')) # TODO: hacky?
|
217
|
-
@defenses = Defenses.new(elem%'defenses')
|
218
|
-
|
219
|
-
# TODO: Massive problem, doesn't fill in resistances for some reason
|
220
|
-
resist_types = ['arcane', 'fire', 'frost', 'holy', 'nature', 'shadow']
|
221
|
-
@resistances = {}
|
222
|
-
resist_types.each do |res|
|
223
|
-
@resistances[res] = Resistance.new(elem%'resistances'%res)
|
224
|
-
end
|
225
|
-
|
226
|
-
@talent_spec = TalentSpec.new(elem%'talentSpec')
|
227
|
-
|
228
|
-
@pvp = Pvp.new(elem%'pvp')
|
229
|
-
|
230
|
-
@professions = []
|
231
|
-
(elem%'professions'/:skill).each do |skill|
|
232
|
-
@professions << Profession.new(skill)
|
233
|
-
end
|
234
|
-
|
235
|
-
@items = []
|
236
|
-
(elem%'items'/:item).each do |item|
|
237
|
-
@items << EquippedItem.new(item)
|
238
|
-
end
|
239
|
-
|
240
|
-
@buffs = []
|
241
|
-
(elem%'buffs'/:spell).each do |buff|
|
242
|
-
@buffs << Buff.new(buff)
|
243
|
-
end
|
244
|
-
|
245
|
-
@debuffs = []
|
246
|
-
(elem%'debuffs'/:spell).each do |debuff|
|
247
|
-
@debuffs << Buff.new(debuff)
|
248
|
-
end
|
249
|
-
end
|
250
|
-
end
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
# Second stat bar, depends on character class
|
255
|
-
class SecondBar
|
256
|
-
attr_reader :effective, :casting, :not_casting, :type
|
257
|
-
|
258
|
-
def initialize(elem)
|
259
|
-
@effective = elem[:effective].to_i
|
260
|
-
@casting = elem[:casting].to_i == -1 ? nil : elem[:casting].to_i
|
261
|
-
@not_casting = elem[:notCasting].to_i == -1 ? nil : elem[:notCasting].to_i
|
262
|
-
@type = elem[:type]
|
263
|
-
end
|
264
|
-
end
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
class BaseStat # abstract?
|
269
|
-
attr_reader :base, :effective
|
270
|
-
end
|
271
|
-
|
272
|
-
class Strength < BaseStat
|
273
|
-
attr_reader :attack, :block
|
274
|
-
def initialize(elem)
|
275
|
-
@base = elem['base'].to_i
|
276
|
-
@effective = elem['effective'].to_i
|
277
|
-
@attack = elem['attack'].to_i
|
278
|
-
@block = elem['block'].to_i == -1 ? nil : elem['block'].to_i
|
279
|
-
end
|
280
|
-
end
|
281
|
-
|
282
|
-
class Agility < BaseStat
|
283
|
-
attr_reader :armor, :attack, :crit_hit_percent
|
284
|
-
def initialize(elem)
|
285
|
-
@base = elem[:base].to_i
|
286
|
-
@effective = elem[:effective].to_i
|
287
|
-
@armor = elem[:armor].to_i
|
288
|
-
@attack = elem[:attack].to_i == -1 ? nil : elem[:attack].to_i
|
289
|
-
@crit_hit_percent = elem[:critHitPercent].to_f
|
290
|
-
end
|
291
|
-
end
|
292
|
-
|
293
|
-
class Stamina < BaseStat
|
294
|
-
attr_reader :health, :pet_bonus
|
295
|
-
def initialize(elem)
|
296
|
-
@base = elem[:base].to_i
|
297
|
-
@effective = elem[:effective].to_i
|
298
|
-
@health = elem[:health].to_i
|
299
|
-
@pet_bonus = elem[:petBonus].to_i == -1 ? nil : elem[:petBonus].to_i
|
300
|
-
end
|
301
|
-
end
|
302
|
-
|
303
|
-
class Intellect < BaseStat
|
304
|
-
attr_reader :mana, :crit_hit_percent, :pet_bonus
|
305
|
-
def initialize(elem)
|
306
|
-
@base = elem[:base].to_i
|
307
|
-
@effective = elem[:effective].to_i
|
308
|
-
@mana = elem[:mana].to_i
|
309
|
-
@crit_hit_percent = elem[:critHitPercent].to_f
|
310
|
-
@pet_bonus = elem[:petBonus].to_i == -1 ? nil : elem[:petBonus].to_i
|
311
|
-
end
|
312
|
-
end
|
313
|
-
|
314
|
-
class Spirit < BaseStat
|
315
|
-
attr_reader :health_regen, :mana_regen
|
316
|
-
def initialize(elem)
|
317
|
-
@base = elem[:base].to_i
|
318
|
-
@effective = elem[:effective].to_i
|
319
|
-
@health_regen = elem[:healthRegen].to_i
|
320
|
-
@mana_regen = elem[:manaRegen].to_i
|
321
|
-
end
|
322
|
-
end
|
323
|
-
|
324
|
-
class Armor < BaseStat
|
325
|
-
attr_reader :percent, :pet_bonus
|
326
|
-
def initialize(elem)
|
327
|
-
@base = elem[:base].to_i
|
328
|
-
@effective = elem[:effective].to_i
|
329
|
-
@percent = elem[:percent].to_f
|
330
|
-
@pet_bonus = elem[:petBonus].to_i == -1 ? nil : elem[:petBonus].to_i
|
331
|
-
end
|
332
|
-
end
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
# <melee>
|
339
|
-
# <mainHandDamage dps="65.6" max="149" min="60" percent="0" speed="1.60"/>
|
340
|
-
# <offHandDamage dps="0.0" max="0" min="0" percent="0" speed="2.00"/>
|
341
|
-
# <mainHandSpeed hastePercent="0.00" hasteRating="0" value="1.60"/>
|
342
|
-
# <offHandSpeed hastePercent="0.00" hasteRating="0" value="2.00"/>
|
343
|
-
# <power base="338" effective="338" increasedDps="24.0"/>
|
344
|
-
# <hitRating increasedHitPercent="0.00" value="0"/>
|
345
|
-
# <critChance percent="4.16" plusPercent="0.00" rating="0"/>
|
346
|
-
# <expertise additional="0" percent="0.00" rating="0" value="0"/>
|
347
|
-
# </melee>
|
348
|
-
class Melee
|
349
|
-
attr_reader :main_hand_skill, :off_hand_skill,
|
350
|
-
:main_hand_damage, :off_hand_damage,
|
351
|
-
:main_hand_speed, :off_hand_speed,
|
352
|
-
:speed, :hit_rating, :crit_chance
|
353
|
-
:expertise
|
354
|
-
|
355
|
-
def initialize(elem)
|
356
|
-
# TODO: Do these not exist anymore?
|
357
|
-
@main_hand_skill = WeaponSkill.new(elem%'mainHandWeaponSkill') if (elem%'mainHandWeaponSkill')
|
358
|
-
@off_hand_skill = WeaponSkill.new(elem%'offHandWeaponSkill') if (elem%'offHandWeaponSkill')
|
359
|
-
|
360
|
-
@main_hand_damage = WeaponDamage.new(elem%'mainHandDamage')
|
361
|
-
@off_hand_damage = WeaponDamage.new(elem%'offHandDamage')
|
362
|
-
|
363
|
-
@main_hand_speed = WeaponSpeed.new(elem%'mainHandSpeed')
|
364
|
-
@off_hand_speed = WeaponSpeed.new(elem%'offHandSpeed')
|
365
|
-
|
366
|
-
@power = WeaponPower.new(elem%'power')
|
367
|
-
@hit_rating = WeaponHitRating.new(elem%'hitRating')
|
368
|
-
@crit_chance = WeaponCritChance.new(elem%'critChance')
|
369
|
-
|
370
|
-
@expertise = WeaponExpertise.new(elem%'expertise')
|
371
|
-
end
|
372
|
-
end
|
373
|
-
|
374
|
-
# <ranged>
|
375
|
-
# <weaponSkill rating="0" value="-1"/>
|
376
|
-
# <damage dps="0.0" max="0" min="0" percent="0" speed="0.00"/>
|
377
|
-
# <speed hastePercent="0.00" hasteRating="0" value="0.00"/>
|
378
|
-
# <power base="57" effective="57" increasedDps="4.0" petAttack="-1.00" petSpell="-1.00"/>
|
379
|
-
# <hitRating increasedHitPercent="0.00" value="0"/>
|
380
|
-
# <critChance percent="0.92" plusPercent="0.00" rating="0"/>
|
381
|
-
# </ranged>
|
382
|
-
class Ranged
|
383
|
-
attr_reader :weapon_skill, :damage, :speed, :power,
|
384
|
-
:hit_rating, :crit_chance
|
385
|
-
|
386
|
-
def initialize(elem)
|
387
|
-
@weapon_skill = WeaponSkill.new(elem%'weaponSkill')
|
388
|
-
@damage = WeaponDamage.new(elem%'damage')
|
389
|
-
@speed = WeaponSpeed.new(elem%'speed')
|
390
|
-
@power = WeaponPower.new(elem%'power')
|
391
|
-
@hit_rating = WeaponHitRating.new(elem%'hitRating')
|
392
|
-
@crit_chance = WeaponCritChance.new(elem%'critChance')
|
393
|
-
end
|
394
|
-
end
|
395
|
-
|
396
|
-
class WeaponSkill
|
397
|
-
attr_reader :rating, :value
|
398
|
-
|
399
|
-
def initialize(elem)
|
400
|
-
@value = elem[:value].to_i == -1 ? nil : elem[:value].to_i
|
401
|
-
@rating = elem[:rating].to_i
|
402
|
-
end
|
403
|
-
end
|
404
|
-
|
405
|
-
class WeaponDamage
|
406
|
-
attr_reader :dps, :max, :min, :percent, :speed
|
407
|
-
|
408
|
-
def initialize(elem)
|
409
|
-
@dps = elem[:dps].to_f
|
410
|
-
@max = elem[:max].to_i
|
411
|
-
@min = elem[:min].to_i
|
412
|
-
@percent = elem[:percent].to_f
|
413
|
-
@speed = elem[:speed].to_f
|
414
|
-
end
|
415
|
-
end
|
416
|
-
|
417
|
-
class WeaponSpeed
|
418
|
-
attr_reader :haste_percent, :haste_rating, :value
|
419
|
-
|
420
|
-
def initialize(elem)
|
421
|
-
@haste_percent = elem[:hastePercent].to_f
|
422
|
-
@haste_rating = elem[:hasteRating].to_f
|
423
|
-
@value = elem[:value].to_f
|
424
|
-
end
|
425
|
-
end
|
426
|
-
|
427
|
-
class WeaponPower
|
428
|
-
attr_reader :base, :effective, :increased_dps, :pet_attack, :pet_spell
|
429
|
-
|
430
|
-
def initialize(elem)
|
431
|
-
@base = elem[:base].to_i
|
432
|
-
@haste_rating = elem[:effective].to_i
|
433
|
-
@increased_dps = elem[:increasedDps].to_f
|
434
|
-
@pet_attack = (elem[:petAttack].to_f == -1 ? nil : elem[:petAttack].to_f)
|
435
|
-
@pet_spell = (elem[:petSpell].to_f == -1 ? nil : elem[:petSpell].to_f)
|
436
|
-
end
|
437
|
-
end
|
438
|
-
|
439
|
-
class WeaponHitRating
|
440
|
-
attr_reader :increased_hit_percent, :value
|
441
|
-
|
442
|
-
def initialize(elem)
|
443
|
-
@increased_hit_percent = elem[:increasedHitPercent].to_f
|
444
|
-
@value = elem[:value].to_f
|
445
|
-
end
|
446
|
-
end
|
447
|
-
|
448
|
-
class WeaponCritChance
|
449
|
-
attr_reader :percent, :plus_percent, :rating
|
450
|
-
|
451
|
-
def initialize(elem)
|
452
|
-
@percent = elem[:percent].to_f
|
453
|
-
@plus_percent = elem[:plusPercent].to_f
|
454
|
-
@rating = elem[:rating].to_i
|
455
|
-
end
|
456
|
-
end
|
457
|
-
|
458
|
-
# <expertise additional="0" percent="0.00" rating="0" value="0"/>
|
459
|
-
class WeaponExpertise
|
460
|
-
attr_reader :additional, :percent, :rating, :value
|
461
|
-
|
462
|
-
def initialize(elem)
|
463
|
-
@additional = elem[:additional].to_i
|
464
|
-
@percent = elem[:percent].to_f
|
465
|
-
@rating = elem[:rating].to_i
|
466
|
-
@value = elem[:value].to_i
|
467
|
-
end
|
468
|
-
end
|
469
|
-
|
470
|
-
|
471
|
-
# Decided to do funky stuff to the XML to make it more useful.
|
472
|
-
# instead of having two seperate lists of bonusDamage and critChance
|
473
|
-
# merged it into one set of objects for each thing
|
474
|
-
class Spell
|
475
|
-
attr_reader :arcane, :fire, :frost, :holy, :nature, :shadow,
|
476
|
-
:hit_rating, :bonus_healing, :penetration, :mana_regen
|
477
|
-
|
478
|
-
def initialize(elem)
|
479
|
-
@arcane = SpellDamage.new(elem%'bonusDamage'%'arcane', elem%'critChance'%'arcane')
|
480
|
-
@fire = SpellDamage.new(elem%'bonusDamage'%'fire', elem%'critChance'%'fire')
|
481
|
-
@frost = SpellDamage.new(elem%'bonusDamage'%'frost', elem%'critChance'%'frost')
|
482
|
-
@holy = SpellDamage.new(elem%'bonusDamage'%'holy', elem%'critChance'%'holy')
|
483
|
-
@nature = SpellDamage.new(elem%'bonusDamage'%'nature', elem%'critChance'%'nature')
|
484
|
-
@shadow = SpellDamage.new(elem%'bonusDamage'%'shadow', elem%'critChance'%'shadow')
|
485
|
-
|
486
|
-
@bonus_healing = (elem%'bonusHealing')[:value].to_i # is this right??
|
487
|
-
@penetration = (elem%'penetration')[:value].to_i
|
488
|
-
@hit_rating = WeaponHitRating.new(elem%'hitRating')
|
489
|
-
@mana_regen = ManaRegen.new(elem%'manaRegen')
|
490
|
-
|
491
|
-
# elements = %w[arcane fire frost holy nature shadow]
|
492
|
-
# elements.each do |element|
|
493
|
-
# # TODO: is this a good idea?
|
494
|
-
# #instance_variable_set("@#{element}", foo) #??
|
495
|
-
# #eval("@#{element} = SpellDamage.new(elem[:bonusDamage][element][:value], elem[:critChance][element][:percent]).to_f)")
|
496
|
-
# # eval("@#{element} = SpellDamage.new((elem%'bonusDamage'%element)[:value].to_i,
|
497
|
-
# # (elem%'critChance'%element)[:percent].to_f)")
|
498
|
-
# end
|
499
|
-
end
|
500
|
-
end
|
501
|
-
|
502
|
-
class SpellDamage
|
503
|
-
attr_reader :value, :crit_chance_percent
|
504
|
-
alias_method :percent, :crit_chance_percent
|
505
|
-
|
506
|
-
def initialize(bonusDamage_elem, critChance_elem)
|
507
|
-
@value = bonusDamage_elem[:value].to_i
|
508
|
-
@crit_chance_percent = critChance_elem[:percent].to_f
|
509
|
-
end
|
510
|
-
end
|
511
|
-
|
512
|
-
class ManaRegen
|
513
|
-
attr_reader :casting, :not_casting
|
514
|
-
|
515
|
-
def initialize(elem)
|
516
|
-
@casting = elem[:casting].to_f
|
517
|
-
@not_casting = elem[:notCasting].to_f
|
518
|
-
end
|
519
|
-
end
|
520
|
-
|
521
|
-
class PetBonus
|
522
|
-
attr_reader :attack, :damage, :from_Type
|
523
|
-
|
524
|
-
def initialize(elem)
|
525
|
-
@attack = elem[:attack].to_i == -1 ? nil : elem[:attack].to_i
|
526
|
-
@damage = elem[:damage].to_i == -1 ? nil : elem[:damage].to_i
|
527
|
-
@from_type = elem[:fromType] if elem[:fromType]
|
528
|
-
end
|
529
|
-
end
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
class Defenses
|
534
|
-
attr_reader :armor, :defense, :dodge, :parry, :block, :resilience
|
535
|
-
|
536
|
-
def initialize(elem)
|
537
|
-
@armor = Armor.new(elem%'armor')
|
538
|
-
@defense = Defense.new(elem%'defense')
|
539
|
-
@dodge = DodgeParryBlock.new(elem%'dodge')
|
540
|
-
@parry = DodgeParryBlock.new(elem%'parry')
|
541
|
-
@block = DodgeParryBlock.new(elem%'block')
|
542
|
-
@resilience = Resilience.new(elem%'resilience')
|
543
|
-
end
|
544
|
-
end
|
545
|
-
|
546
|
-
class Armor
|
547
|
-
attr_reader :base, :effective, :percent, :pet_bonus
|
548
|
-
|
549
|
-
def initialize(elem)
|
550
|
-
@base = elem[:base].to_i
|
551
|
-
@effective = elem[:effective].to_i
|
552
|
-
@percent = elem[:percent].to_f
|
553
|
-
@pet_bonus = elem[:petBonus].to_i == -1 ? nil : elem[:petBonus].to_i
|
554
|
-
end
|
555
|
-
end
|
556
|
-
|
557
|
-
class Defense
|
558
|
-
attr_reader :value, :increase_percent, :decrease_percent, :plus_defense, :rating
|
559
|
-
|
560
|
-
def initialize(elem)
|
561
|
-
@value = elem[:value].to_i
|
562
|
-
@increase_percent = elem[:increasePercent].to_f
|
563
|
-
@decrease_percent = elem[:decreasePercent].to_f
|
564
|
-
@plus_defense = elem[:plusDefense].to_i
|
565
|
-
@rating = elem[:rating].to_i
|
566
|
-
end
|
567
|
-
end
|
568
|
-
|
569
|
-
class DodgeParryBlock
|
570
|
-
attr_reader :percent, :increase_percent, :rating
|
571
|
-
|
572
|
-
def initialize(elem)
|
573
|
-
@percent = elem[:percent].to_f
|
574
|
-
@increase_percent = elem[:increasePercent].to_f
|
575
|
-
@rating = elem[:rating].to_i
|
576
|
-
end
|
577
|
-
end
|
578
|
-
|
579
|
-
class Resilience
|
580
|
-
attr_reader :damage_percent, :hit_percent, :value
|
581
|
-
|
582
|
-
def initialize(elem)
|
583
|
-
@damage_percent = elem[:damagePercent].to_f
|
584
|
-
@hit_percent = elem[:hitPercent].to_f
|
585
|
-
@value = elem[:value].to_f
|
586
|
-
end
|
587
|
-
end
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
class Resistance
|
592
|
-
attr_reader :value, :pet_bonus
|
593
|
-
|
594
|
-
def initialize(elem)
|
595
|
-
@value = elem[:value].to_i
|
596
|
-
@pet_bonus = elem[:petBonus].to_i == -1 ? nil : elem[:petBonus].to_i
|
597
|
-
end
|
598
|
-
end
|
599
|
-
|
600
|
-
|
601
|
-
# Note the list of talent trees starts at 1. This is quirky, but that's what's used in the XML
|
602
|
-
class TalentSpec
|
603
|
-
attr_reader :trees
|
604
|
-
|
605
|
-
def initialize(elem)
|
606
|
-
@trees = []
|
607
|
-
@trees[1] = elem[:treeOne].to_i
|
608
|
-
@trees[2] = elem[:treeTwo].to_i
|
609
|
-
@trees[3] = elem[:treeThree].to_i
|
610
|
-
end
|
611
|
-
end
|
612
|
-
|
613
|
-
|
614
|
-
# Player-versus-player data
|
615
|
-
class Pvp
|
616
|
-
attr_reader :lifetime_honorable_kills, :arena_currency
|
617
|
-
|
618
|
-
def initialize(elem)
|
619
|
-
@lifetime_honorable_kills = (elem%'lifetimehonorablekills')[:value].to_i
|
620
|
-
@arena_currency = (elem%'arenacurrency')[:value].to_i
|
621
|
-
end
|
622
|
-
end
|
623
|
-
|
624
|
-
|
625
|
-
# A buff
|
626
|
-
class Buff
|
627
|
-
attr_reader :name, :effect, :icon
|
628
|
-
|
629
|
-
def initialize(elem)
|
630
|
-
@name = elem[:name]
|
631
|
-
@effect = elem[:effect]
|
632
|
-
@icon = elem[:icon]
|
633
|
-
end
|
634
|
-
end
|
635
|
-
|
636
|
-
|
637
|
-
# A player's profession, players can only have 2 max
|
638
|
-
class Profession
|
639
|
-
attr_reader :key, :name, :max, :value
|
640
|
-
|
641
|
-
def initialize(elem)
|
642
|
-
@key = elem[:key]
|
643
|
-
@name = elem[:name]
|
644
|
-
@value = elem[:value].to_i
|
645
|
-
@max = elem[:max].to_i
|
646
|
-
end
|
647
|
-
end
|
648
|
-
|
649
|
-
|
650
|
-
# An item equipped to a player
|
651
|
-
class EquippedItem < Item
|
652
|
-
attr_reader :durability, :max_durability, #:id, :item_id, :icon,
|
653
|
-
:gems, :permanent_enchant,
|
654
|
-
:random_properties_id, :seed, :slot
|
655
|
-
|
656
|
-
def initialize(elem)
|
657
|
-
super(elem)
|
658
|
-
#@id = elem[:id].to_i
|
659
|
-
#@icon = elem[:icon]
|
660
|
-
@durability = elem[:durability].to_i
|
661
|
-
@max_durability = elem[:maxDurability].to_i
|
662
|
-
@gems = []
|
663
|
-
@gems[0] = elem[:gem0Id].to_i == 0 ? nil : elem[:gem0Id].to_i
|
664
|
-
@gems[1] = elem[:gem1Id].to_i == 0 ? nil : elem[:gem1Id].to_i
|
665
|
-
@gems[2] = elem[:gem2Id].to_i == 0 ? nil : elem[:gem2Id].to_i
|
666
|
-
@permanent_enchant = elem[:permanentEnchant].to_i
|
667
|
-
@random_properties_id = elem[:randomPropertiesId] == 0 ? nil : elem[:randomPropertiesId].to_i
|
668
|
-
@seed = elem[:seed].to_i # not sure if seed is so big it's overloading
|
669
|
-
@slot = elem[:slot].to_i
|
670
|
-
end
|
671
|
-
end
|
672
|
-
|
673
|
-
|
674
|
-
# A player guild containing members
|
675
|
-
# note not all of these will be filled out, depending on how the data is found
|
676
|
-
class Guild
|
677
|
-
attr_reader :name, :url, :realm, :realm_url, :battle_group,
|
678
|
-
:roster_url, :stats_url, :stats_url_escape,
|
679
|
-
:faction, :faction_id,
|
680
|
-
:members, :member_count
|
681
|
-
|
682
|
-
def initialize(elem)
|
683
|
-
if (elem%'guildKey')
|
684
|
-
guild = (elem%'guildKey')
|
685
|
-
else
|
686
|
-
guild = elem
|
687
|
-
end
|
688
|
-
|
689
|
-
@name = guild[:name]
|
690
|
-
@name_url = guild[:nameUrl]
|
691
|
-
@url = guild[:url]
|
692
|
-
@realm = guild[:realm]
|
693
|
-
@realm_url = guild[:realmUrl]
|
694
|
-
@battle_group = guild[:battleGroup]
|
695
|
-
@faction = guild[:faction]
|
696
|
-
@faction_id = guild[:factionId].to_i
|
697
|
-
|
698
|
-
# some shortened versions
|
699
|
-
if (elem%'guildInfo')
|
700
|
-
@member_count = (elem%'guildInfo'%'guild'%'members')[:memberCount].to_i || nil
|
701
|
-
|
702
|
-
@members = []
|
703
|
-
(elem%'guildInfo'%'guild'%'members'/:character).each do |char|
|
704
|
-
members << Character.new(char)
|
705
|
-
end
|
706
|
-
end
|
707
|
-
end
|
708
|
-
end
|
709
|
-
|
710
|
-
|
711
|
-
# General skill category
|
712
|
-
# eg Weapon Skills, Languages
|
713
|
-
class SkillCategory
|
714
|
-
attr_reader :key, :name, :skills
|
715
|
-
|
716
|
-
def initialize(elem)
|
717
|
-
@key = elem[:key]
|
718
|
-
@name = elem[:name]
|
719
|
-
|
720
|
-
@skills = []
|
721
|
-
(elem/:skill).each do |skill|
|
722
|
-
@skills << Skill.new(skill)
|
723
|
-
end
|
724
|
-
end
|
725
|
-
end
|
726
|
-
|
727
|
-
#
|
728
|
-
# eg Daggers, Riding, Fishing
|
729
|
-
class Skill
|
730
|
-
attr_reader :key, :name, :value, :max
|
731
|
-
|
732
|
-
def initialize(elem)
|
733
|
-
@key = elem[:key]
|
734
|
-
@name = elem[:name]
|
735
|
-
@value = elem[:value]
|
736
|
-
@max = elem[:max]
|
737
|
-
end
|
738
|
-
end
|
739
|
-
|
740
|
-
|
741
|
-
|
742
|
-
|
743
|
-
# Larger group of factions
|
744
|
-
# eg Alliance, Shattrath City, Steamwheedle Cartel
|
745
|
-
# character-reputation.xml
|
746
|
-
class FactionCategory
|
747
|
-
attr_reader :key, :name, :factions
|
748
|
-
|
749
|
-
def initialize(elem)
|
750
|
-
@key = elem[:key]
|
751
|
-
@name = elem[:name]
|
752
|
-
|
753
|
-
@factions = []
|
754
|
-
(elem/:faction).each do |faction|
|
755
|
-
@factions << Faction.new(faction)
|
756
|
-
end
|
757
|
-
end
|
758
|
-
end
|
759
|
-
|
760
|
-
# Smaller NPC faction that is part of a FactionCategory
|
761
|
-
# eg Darnassus, Argent Dawn
|
762
|
-
class Faction
|
763
|
-
attr_reader :key, :name, :reputation
|
764
|
-
|
765
|
-
def initialize(elem)
|
766
|
-
@key = elem[:key]
|
767
|
-
@name = elem[:name]
|
768
|
-
@reputation = elem[:reputation].to_i
|
769
|
-
end
|
770
|
-
end
|
771
|
-
|
772
|
-
|
773
|
-
|
774
|
-
|
775
|
-
# Provides detailed item information
|
776
|
-
# Note that the itemtooltip XML just returns an empty document when the item
|
777
|
-
# can't be found.
|
778
|
-
class ItemTooltip < Item
|
779
|
-
attr_reader :desc, :overall_quality_id, :bonding, :max_count, #:id, :name, :icon,
|
780
|
-
:class_id, :bonuses, :item_source,
|
781
|
-
:bonuses, :resistances,
|
782
|
-
:required_level,
|
783
|
-
:allowable_classes,
|
784
|
-
:armor, :durability,
|
785
|
-
:sockets, :socket_match_enchant,
|
786
|
-
:gem_properties
|
787
|
-
alias_method :description, :desc
|
788
|
-
|
789
|
-
def initialize(elem)
|
790
|
-
@id = (elem%'id').html.to_i
|
791
|
-
@name = (elem%'name').html
|
792
|
-
@icon = (elem%'icon').html
|
793
|
-
@desc = (elem%'desc').html if (elem%'desc')
|
794
|
-
@overall_quality_id = (elem%'overallQualityId').html.to_i
|
795
|
-
@bonding = (elem%'bonding').html.to_i
|
796
|
-
@stackable = (elem%'stackable').html.to_i if (elem%'stackable')
|
797
|
-
@max_count = (elem%'maxCount').html.to_i if (elem%'maxCount')
|
798
|
-
@class_id = (elem%'classId').html.to_i
|
799
|
-
@required_level = (elem%'requiredLevel').html.to_i if (elem%'requiredLevel')
|
800
|
-
|
801
|
-
@equipData = ItemEquipData.new(elem%'equipData')
|
802
|
-
|
803
|
-
# TODO: This appears to be a plain string at the moment
|
804
|
-
#<gemProperties>+26 Healing +9 Spell Damage and 2% Reduced Threat</gemProperties>
|
805
|
-
@gem_properties = (elem%'gemProperties').html if (elem%'gemProperties')
|
806
|
-
|
807
|
-
# not all items have damage data
|
808
|
-
@damage = ItemDamageData.new(elem%'damageData') if !(elem%'damageData').html.empty?
|
809
|
-
|
810
|
-
|
811
|
-
# TODO: Test socket data with a variety of items
|
812
|
-
# TODO: replace with socket Class?
|
813
|
-
if (elem%'socketData')
|
814
|
-
@sockets = []
|
815
|
-
(elem%'socketData'/:socket).each do |socket|
|
816
|
-
@sockets << socket[:color]
|
817
|
-
end
|
818
|
-
|
819
|
-
@socket_match_enchant = (elem%'socketData'%'socketMatchEnchant')
|
820
|
-
end
|
821
|
-
|
822
|
-
|
823
|
-
# When there is no data, stats are not present in @bonuses
|
824
|
-
# TODO: When there is no stats at all, @bonuses shouldn't be set
|
825
|
-
@bonuses = {}
|
826
|
-
|
827
|
-
bonus_stats = {
|
828
|
-
:strength => :bonusStrength,
|
829
|
-
:agility => :bonusAgility,
|
830
|
-
:stamina => :bonusStamina,
|
831
|
-
:intellect => :bonusIntellect,
|
832
|
-
:spirit => :bonusSpirit
|
833
|
-
}
|
834
|
-
bonus_stats.each do |stat, xml_elem|
|
835
|
-
@bonuses[stat] = test_stat(elem/xml_elem) if test_stat(elem/xml_elem)
|
836
|
-
end
|
837
|
-
|
838
|
-
# Resistances
|
839
|
-
@resistances = {}
|
840
|
-
|
841
|
-
resist_stats = {
|
842
|
-
:arcane => :arcaneResist,
|
843
|
-
:fire => :fireResist,
|
844
|
-
:frost => :frostResist,
|
845
|
-
:holy => :holyResist,
|
846
|
-
:nature => :natureResist,
|
847
|
-
:shadow => :shadowResist
|
848
|
-
}
|
849
|
-
resist_stats.each do |stat, xml_elem|
|
850
|
-
@resistances[stat] = test_stat(elem/xml_elem) if test_stat(elem/xml_elem)
|
851
|
-
end
|
852
|
-
|
853
|
-
|
854
|
-
if (elem%'allowableClasses')
|
855
|
-
@allowable_classes = []
|
856
|
-
(elem%'allowableClasses'/:class).each do |klass|
|
857
|
-
@allowable_classes << klass.html
|
858
|
-
end
|
859
|
-
end
|
860
|
-
|
861
|
-
# NOTE not representing armor bonus
|
862
|
-
@armor = (elem%'armor').html.to_i if (elem%'armor')
|
863
|
-
|
864
|
-
# NOTE not representing max
|
865
|
-
@durability = (elem%'durability')[:current].to_i if (elem%'durability')
|
866
|
-
|
867
|
-
if (elem%'spellData')
|
868
|
-
@spells = []
|
869
|
-
(elem%'spellData'/:spell).each do |spell|
|
870
|
-
@spells << ItemSpell.new(spell)
|
871
|
-
end
|
872
|
-
end
|
873
|
-
|
874
|
-
@setData = ItemSetData.new(elem%'setData') if (elem%'setData')
|
875
|
-
|
876
|
-
# @item_sources = []
|
877
|
-
# (elem/:itemSource).each do |source|
|
878
|
-
# @item_sources << ItemSource.new(source)
|
879
|
-
# end
|
880
|
-
@item_source = ItemSource.new(elem%'itemSource') if (elem%'itemSource') # TODO: More than once source?
|
881
|
-
end
|
882
|
-
|
883
|
-
private
|
884
|
-
def test_stat(elem)
|
885
|
-
if elem
|
886
|
-
if !elem.html.empty?
|
887
|
-
return elem.html.to_i
|
888
|
-
end
|
889
|
-
end
|
890
|
-
return nil
|
891
|
-
end
|
892
|
-
end
|
893
|
-
|
894
|
-
class ItemEquipData
|
895
|
-
attr_reader :inventory_type, :subclass_name, :container_slots
|
896
|
-
|
897
|
-
def initialize(elem)
|
898
|
-
@inventory_type = (elem%'inventoryType').html.to_i
|
899
|
-
@subclass_name = (elem%'subclassName').html if (elem%'subclassName')
|
900
|
-
@container_slots = (elem%'containerSlots').html.to_i if (elem%'containerSlots') # for baggies
|
901
|
-
end
|
902
|
-
end
|
903
|
-
|
904
|
-
class ItemSetData
|
905
|
-
attr_reader :name, :items, :set_bonuses
|
906
|
-
|
907
|
-
def initialize(elem)
|
908
|
-
@name = elem[:name]
|
909
|
-
|
910
|
-
@items = []
|
911
|
-
(elem/:item).each do |item|
|
912
|
-
@items << item[:name]
|
913
|
-
end
|
914
|
-
|
915
|
-
@set_bonuses = []
|
916
|
-
(elem/:setBonus).each do |bonus|
|
917
|
-
@set_bonuses << ItemSetBonus.new(bonus)
|
918
|
-
end
|
919
|
-
end
|
920
|
-
end
|
921
|
-
|
922
|
-
class ItemSetBonus
|
923
|
-
attr_reader :threshold, :description
|
924
|
-
alias_method :desc, :description
|
925
|
-
|
926
|
-
def initialize(elem)
|
927
|
-
@threshold = elem[:threshold].to_i
|
928
|
-
@description = elem[:desc]
|
929
|
-
end
|
930
|
-
end
|
931
|
-
|
932
|
-
class ItemSpell
|
933
|
-
attr_reader :trigger, :description
|
934
|
-
alias_method :desc, :description
|
935
|
-
|
936
|
-
def initialize(elem)
|
937
|
-
@trigger = (elem%'trigger').html.to_i
|
938
|
-
@description = (elem%'desc').html
|
939
|
-
end
|
940
|
-
end
|
941
|
-
|
942
|
-
class ItemDamageData
|
943
|
-
attr_reader :type, :min, :max, :speed, :dps
|
944
|
-
|
945
|
-
def initialize(elem)
|
946
|
-
@type = (elem%'damage'%'type').html.to_i
|
947
|
-
@min = (elem%'damage'%'min').html.to_i
|
948
|
-
@max = (elem%'damage'%'max').html.to_i
|
949
|
-
@speed = (elem%'speed').html.to_i
|
950
|
-
@dps = (elem%'dps').html.to_f
|
951
|
-
end
|
952
|
-
end
|
953
|
-
|
954
|
-
class ItemSource
|
955
|
-
attr_reader :value,
|
956
|
-
:area_id, :area_name,
|
957
|
-
:creature_id, :creature_name,
|
958
|
-
:difficulty, :drop_rate
|
959
|
-
|
960
|
-
def initialize(elem)
|
961
|
-
@value = elem[:value]
|
962
|
-
@area_id = elem[:areaId].to_i if elem[:areaId]
|
963
|
-
@area_name = elem[:areaName] if elem[:areaName]
|
964
|
-
@creature_id = elem[:creatureId].to_i if elem[:creatureId]
|
965
|
-
@creature_name = elem[:creatureName] if elem[:creatureName]
|
966
|
-
@difficulty = elem[:difficulty] if elem[:difficulty]
|
967
|
-
@drop_rate = elem[:dropRate].to_i if elem[:dropRate]
|
968
|
-
@required_level = elem[:reqLvl].to_i if elem[:reqLvl]
|
969
|
-
end
|
970
|
-
end
|
971
|
-
|
972
|
-
|
973
|
-
|
974
|
-
# A really basic item type returned by searches
|
975
|
-
class SearchItem < Item
|
976
|
-
attr_reader :url, :rarity,
|
977
|
-
:source, :item_level, :relevance
|
978
|
-
alias_method :level, :item_level
|
979
|
-
|
980
|
-
def initialize(elem)
|
981
|
-
super(elem)
|
982
|
-
@rarity = elem[:rarity].to_i
|
983
|
-
@url = elem[:url]
|
984
|
-
|
985
|
-
@item_level = elem.at("filter[@name='itemLevel']")[:value].to_i
|
986
|
-
@source = elem.at("filter[@name='source']")[:value]
|
987
|
-
@relevance = elem.at("filter[@name='relevance']")[:value].to_i
|
988
|
-
end
|
989
|
-
end
|
990
|
-
|
991
|
-
|
992
|
-
|
993
|
-
|
994
|
-
# uses item-info.xml
|
995
|
-
class ItemInfo < Item
|
996
|
-
attr_reader :icon, :id, :level, :name, :quality, :type,
|
997
|
-
:cost, :disenchants, :disenchant_skill_rank, :vendors,
|
998
|
-
:plans_for
|
999
|
-
|
1000
|
-
def initialize(elem)
|
1001
|
-
@id = elem[:id].to_i
|
1002
|
-
@level = elem[:level].to_i
|
1003
|
-
@name = elem[:name]
|
1004
|
-
@icon = elem[:icon]
|
1005
|
-
@quality = elem[:quality].to_i
|
1006
|
-
@type = elem[:type]
|
1007
|
-
|
1008
|
-
# Cost can be in gold, or tokens
|
1009
|
-
@cost = ItemCost.new(elem%'cost') if (elem%'cost')
|
1010
|
-
|
1011
|
-
|
1012
|
-
|
1013
|
-
# is costs really an array?
|
1014
|
-
#@costs = []
|
1015
|
-
#(elem/:cost).each do |cost|
|
1016
|
-
# @costs << ItemCost.new(cost)
|
1017
|
-
#end
|
1018
|
-
|
1019
|
-
if (elem%'disenchantLoot')
|
1020
|
-
@disenchant_skill_rank = (elem%'disenchantLoot')[:requiredSkillRank].to_i
|
1021
|
-
|
1022
|
-
@disenchant_items = []
|
1023
|
-
(elem%'disenchantLoot'/:item).each do |item|
|
1024
|
-
@disenchant_items << DisenchantItem.new(item)
|
1025
|
-
end
|
1026
|
-
end
|
1027
|
-
|
1028
|
-
if (elem%'objectiveOfQuests')
|
1029
|
-
@objective_of_quests = []
|
1030
|
-
(elem%'objectiveOfQuests'/:quest).each do |quest|
|
1031
|
-
@objective_of_quests << ItemQuest.new(quest)
|
1032
|
-
end
|
1033
|
-
end
|
1034
|
-
|
1035
|
-
if (elem%'rewardFromQuests')
|
1036
|
-
@reward_from_quests = []
|
1037
|
-
(elem%'rewardFromQuests'/:quest).each do |quest|
|
1038
|
-
@reward_from_quests << ItemQuest.new(quest)
|
1039
|
-
end
|
1040
|
-
end
|
1041
|
-
|
1042
|
-
if (elem%'vendors')
|
1043
|
-
@vendors = []
|
1044
|
-
(elem%'vendors'/:creature).each do |vendor|
|
1045
|
-
@vendors << ItemVendor.new(vendor)
|
1046
|
-
end
|
1047
|
-
end
|
1048
|
-
|
1049
|
-
if (elem%'dropCreatures')
|
1050
|
-
@drop_creatures = []
|
1051
|
-
(elem%'dropCreatures'/:creature).each do |creature|
|
1052
|
-
@drop_creatures << ItemDropCreature.new(creature)
|
1053
|
-
end
|
1054
|
-
end
|
1055
|
-
|
1056
|
-
if (elem%'plansFor')
|
1057
|
-
@plans_for = []
|
1058
|
-
(elem%'plansFor'/:spell).each do |plan|
|
1059
|
-
@plans_for << ItemPlansFor.new(plan)
|
1060
|
-
end
|
1061
|
-
end
|
1062
|
-
|
1063
|
-
if (elem%'createdBy')
|
1064
|
-
@created_by = []
|
1065
|
-
(elem%'createdBy'/:spell).each do |c|
|
1066
|
-
@created_by << ItemCreatedBy.new(c)
|
1067
|
-
end
|
1068
|
-
end
|
1069
|
-
end
|
1070
|
-
end
|
1071
|
-
|
1072
|
-
# <rewardFromQuests>
|
1073
|
-
# <quest name="Justice Dispensed" level="39" reqMinLevel="30" id="11206" area="Dustwallow Marsh" suggestedPartySize="0"></quest>
|
1074
|
-
# <quest name="Peace at Last" level="39" reqMinLevel="30" id="11152" area="Dustwallow Marsh" suggestedPartySize="0"></quest>
|
1075
|
-
# </rewardFromQuests>
|
1076
|
-
# TODO: Rename
|
1077
|
-
class ItemQuest
|
1078
|
-
attr_reader :name, :id, :level, :min_level, :area, :suggested_party_size
|
1079
|
-
|
1080
|
-
def initialize(elem)
|
1081
|
-
@name = elem[:name]
|
1082
|
-
@id = elem[:id].to_i
|
1083
|
-
@level = elem[:level].to_i
|
1084
|
-
@min_level = elem[:min_level].to_i
|
1085
|
-
@area = elem[:area]
|
1086
|
-
@suggested_party_size = elem[:suggested_party_size].to_i
|
1087
|
-
end
|
1088
|
-
end
|
1089
|
-
|
1090
|
-
|
1091
|
-
|
1092
|
-
# Creatures that drop the item
|
1093
|
-
# <creature name="Giant Marsh Frog" minLevel="1" type="Critter" maxLevel="1" dropRate="6" id="23979" classification="0" area="Dustwallow Marsh"></creature>
|
1094
|
-
# <creature name="Nalorakk" minLevel="73" title="Bear Avatar" url="fl[source]=dungeon&fl[difficulty]=normal&fl[boss]=23576" type="Humanoid" maxLevel="73" dropRate="2" id="23576" classification="3" areaUrl="fl[source]=dungeon&fl[boss]=all&fl[difficulty]=normal&fl[dungeon]=3805" area="Zul'Aman"></creature>
|
1095
|
-
class ItemDropCreature
|
1096
|
-
attr_reader :name, :id, :type, :min_level, :max_level, :drop_rate, :classification, :area
|
1097
|
-
|
1098
|
-
def initialize(elem)
|
1099
|
-
@name = elem[:name]
|
1100
|
-
@id = elem[:id].to_i
|
1101
|
-
@min_level = elem[:minLevel].to_i
|
1102
|
-
@max_level = elem[:maxLevel].to_i
|
1103
|
-
@drop_rate = elem[:dropRate].to_i
|
1104
|
-
@classification = elem[:classification].to_i
|
1105
|
-
@area = elem[:area]
|
1106
|
-
|
1107
|
-
# optional boss stuff
|
1108
|
-
@title = elem[:title] if elem[:title] # TODO: not nil when no property?
|
1109
|
-
@url = elem[:url] if elem[:url]
|
1110
|
-
@type = elem[:type] if elem[:type] # Humanoid etc.
|
1111
|
-
@area_url = elem[:areaUrl] if elem[:areaUrl]
|
1112
|
-
end
|
1113
|
-
end
|
1114
|
-
|
1115
|
-
# Cost can be gold or a set of required tokens
|
1116
|
-
# See ItemCostToken
|
1117
|
-
# <cost sellPrice="280" buyPrice="5600"></cost>
|
1118
|
-
# <cost>
|
1119
|
-
# <token icon="spell_holy_championsbond" id="29434" count="60"></token>
|
1120
|
-
# </cost>
|
1121
|
-
class ItemCost
|
1122
|
-
attr_reader :buy_price, :sell_price, :tokens
|
1123
|
-
|
1124
|
-
def initialize(elem)
|
1125
|
-
@buy_price = elem[:buyPrice].to_i if elem[:buyPrice]
|
1126
|
-
@sell_price = elem[:sellPrice].to_i if elem[:sellPrice]
|
1127
|
-
|
1128
|
-
if (elem%'token')
|
1129
|
-
@tokens = []
|
1130
|
-
(elem/:token).each do |token|
|
1131
|
-
@tokens << ItemCostToken.new(token)
|
1132
|
-
end
|
1133
|
-
end
|
1134
|
-
end
|
1135
|
-
end
|
1136
|
-
|
1137
|
-
# <token icon="spell_holy_championsbond" id="29434" count="60"></token>
|
1138
|
-
class ItemCostToken
|
1139
|
-
attr_reader :id, :icon, :count
|
1140
|
-
|
1141
|
-
def initialize(elem)
|
1142
|
-
@id = elem[:id].to_i
|
1143
|
-
@icon = elem[:icon]
|
1144
|
-
@count = elem[:count].to_i
|
1145
|
-
end
|
1146
|
-
end
|
1147
|
-
|
1148
|
-
# <item name="Void Crystal" minCount="1" maxCount="2" icon="inv_enchant_voidcrystal" type="Enchanting" level="70" dropRate="6" id="22450" quality="4"></item>
|
1149
|
-
class DisenchantItem
|
1150
|
-
attr_reader :name, :id, :icon, :level, :type, :drop_rate, :min_count, :max_count, :quality
|
1151
|
-
|
1152
|
-
def initialize(elem)
|
1153
|
-
@name = elem[:name]
|
1154
|
-
@id = elem[:id].to_i
|
1155
|
-
@icon = elem[:icon]
|
1156
|
-
@level = elem[:level].to_i
|
1157
|
-
@type = elem[:type]
|
1158
|
-
@drop_rate = elem[:dropRate].to_i
|
1159
|
-
@min_count = elem[:minCount].to_i
|
1160
|
-
@max_count = elem[:maxCount].to_i
|
1161
|
-
@quality = elem[:quality].to_i
|
1162
|
-
end
|
1163
|
-
end
|
1164
|
-
|
1165
|
-
class ItemVendor
|
1166
|
-
attr_reader :id, :name, :title, :type,
|
1167
|
-
:area, :classification, :max_level, :min_level
|
1168
|
-
|
1169
|
-
def initialize(elem)
|
1170
|
-
@id = elem[:id].to_i
|
1171
|
-
@name = elem[:name]
|
1172
|
-
@title = elem[:title]
|
1173
|
-
@type = elem[:type]
|
1174
|
-
@area = elem[:area]
|
1175
|
-
@classification = elem[:classification].to_i
|
1176
|
-
@max_level = elem[:maxLevel].to_i
|
1177
|
-
@min_level = elem[:minLevel].to_i
|
1178
|
-
end
|
1179
|
-
end
|
1180
|
-
|
1181
|
-
|
1182
|
-
|
1183
|
-
|
1184
|
-
# TODO rename
|
1185
|
-
# There is some sort of opposite relationship between PlansFor and CreatedBy
|
1186
|
-
class ItemCreation
|
1187
|
-
attr_reader :name, :id, :icon,
|
1188
|
-
:item, :reagents
|
1189
|
-
|
1190
|
-
def initialize(elem)
|
1191
|
-
@name = elem[:name]
|
1192
|
-
@id = elem[:id].to_i
|
1193
|
-
@icon = elem[:icon]
|
1194
|
-
|
1195
|
-
# not all items have reagents, some are just spells
|
1196
|
-
if (elem%'reagent')
|
1197
|
-
@reagents = []
|
1198
|
-
(elem/:reagent).each do |reagent|
|
1199
|
-
@reagents << Reagent.new(reagent)
|
1200
|
-
end
|
1201
|
-
end
|
1202
|
-
end
|
1203
|
-
end
|
1204
|
-
|
1205
|
-
|
1206
|
-
# <plansFor>
|
1207
|
-
# <spell name="Shadowprowler's Chestguard" icon="trade_leatherworking" id="42731">
|
1208
|
-
# <item name="Shadowprowler's Chestguard" icon="inv_chest_plate11" type="Leather" level="105" id="33204" quality="4"></item>
|
1209
|
-
# <reagent name="Heavy Knothide Leather" icon="inv_misc_leatherscrap_11" id="23793" count="10"></reagent>
|
1210
|
-
# <reagent name="Bolt of Soulcloth" icon="inv_fabric_soulcloth_bolt" id="21844" count="16"></reagent>
|
1211
|
-
# <reagent name="Primal Earth" icon="inv_elemental_primal_earth" id="22452" count="12"></reagent>
|
1212
|
-
# <reagent name="Primal Shadow" icon="inv_elemental_primal_shadow" id="22456" count="12"></reagent>
|
1213
|
-
# <reagent name="Primal Nether" icon="inv_elemental_primal_nether" id="23572" count="2"></reagent>
|
1214
|
-
# </spell>
|
1215
|
-
# </plansFor>
|
1216
|
-
class ItemPlansFor < ItemCreation
|
1217
|
-
def initialize(elem)
|
1218
|
-
super(elem)
|
1219
|
-
# TODO: Multiple items?
|
1220
|
-
@item = CreatedItem.new(elem%'item') if (elem%'item')
|
1221
|
-
end
|
1222
|
-
end
|
1223
|
-
|
1224
|
-
# <createdBy>
|
1225
|
-
# <spell name="Bracing Earthstorm Diamond" icon="temp" id="32867">
|
1226
|
-
# <item requiredSkill="Jewelcrafting" name="Design: Bracing Earthstorm Diamond" icon="inv_scroll_03" type="Jewelcrafting" level="73" id="25903" requiredSkillRank="365" quality="1"></item>
|
1227
|
-
# <reagent name="Earthstorm Diamond" icon="inv_misc_gem_diamond_04" id="25867" count="1"></reagent>
|
1228
|
-
# </spell>
|
1229
|
-
# </createdBy>
|
1230
|
-
class ItemCreatedBy < ItemCreation
|
1231
|
-
def initialize(elem)
|
1232
|
-
super(elem)
|
1233
|
-
# TODO: Multiple items?
|
1234
|
-
@item = PlanItem.new(elem%'item') if (elem%'item')
|
1235
|
-
end
|
1236
|
-
end
|
1237
|
-
|
1238
|
-
# TODO: Might be better to reuse an existing Item class?
|
1239
|
-
# <item name="Shadowprowler's Chestguard" icon="inv_chest_plate11" type="Leather" level="105" id="33204" quality="4"></item>
|
1240
|
-
class CreatedItem < Item
|
1241
|
-
attr_reader :type, :level, :quality
|
1242
|
-
|
1243
|
-
def initialize(elem)
|
1244
|
-
super(elem)
|
1245
|
-
@type = elem[:type]
|
1246
|
-
@level = elem[:level].to_i
|
1247
|
-
@quality = elem[:quality].to_i
|
1248
|
-
end
|
1249
|
-
end
|
1250
|
-
|
1251
|
-
# TODO: Might be better to reuse an existing Item class?
|
1252
|
-
# <item requiredSkill="Jewelcrafting" name="Design: Bracing Earthstorm Diamond" icon="inv_scroll_03" type="Jewelcrafting" level="73" id="25903" requiredSkillRank="365" quality="1"></item>
|
1253
|
-
class PlanItem < Item
|
1254
|
-
attr_reader :required_skill, :type, :required_skill_rank, :level, :quality
|
1255
|
-
|
1256
|
-
def initialize(elem)
|
1257
|
-
super(elem)
|
1258
|
-
@type = elem[:type]
|
1259
|
-
@level = elem[:level].to_i
|
1260
|
-
@quality = elem[:quality].to_i
|
1261
|
-
@required_skill = elem[:requiredSkill]
|
1262
|
-
@required_skill_rank = elem[:requiredSkillRank].to_i
|
1263
|
-
end
|
1264
|
-
end
|
1265
|
-
|
1266
|
-
class Reagent
|
1267
|
-
attr_reader :id, :name, :icon, :count
|
1268
|
-
|
1269
|
-
def initialize(elem)
|
1270
|
-
@id = elem[:id].to_i
|
1271
|
-
@name = elem[:name]
|
1272
|
-
@icon = elem[:icon]
|
1273
|
-
@count = elem[:count].to_i
|
1274
|
-
end
|
1275
|
-
end
|
1276
|
-
|
1277
|
-
|
1278
|
-
|
1279
|
-
# A group of individuals
|
1280
|
-
# Note that search results don't contain the members
|
1281
|
-
# <arenaTeams>
|
1282
|
-
# <arenaTeam battleGroup="Blackout" faction="Alliance" factionId="0" gamesPlayed="10" gamesWon="7" lastSeasonRanking="0" name="SØPPERBIL" ranking="8721" rating="1610" realm="Draenor" realmUrl="b=Blackout&r=Draenor&ts=2&t=S%C3%98PPERBIL&ff=realm&fv=Draenor&select=S%C3%98PPERBIL" seasonGamesPlayed="49" seasonGamesWon="28" size="2" url="r=Draenor&ts=2&t=S%C3%98PPERBIL&select=S%C3%98PPERBIL">
|
1283
|
-
# <emblem background="ff2034cc" borderColor="ff14a30c" borderStyle="1" iconColor="ff1d800a" iconStyle="95"/>
|
1284
|
-
# <members>
|
1285
|
-
# <character battleGroup="" charUrl="r=Draenor&n=Arussil" class="Rogue" classId="4" contribution="1613" gamesPlayed="10" gamesWon="7" gender="Male" genderId="0" guild="Adept" guildId="38253" guildUrl="r=Draenor&n=Adept&p=1" name="Arussil" race="Night Elf" raceId="4" seasonGamesPlayed="48" seasonGamesWon="28" teamRank="0"/>
|
1286
|
-
# <character battleGroup="" charUrl="r=Draenor&n=Cake" class="Shaman" classId="7" contribution="1516" gamesPlayed="0" gamesWon="0" gender="Male" genderId="0" guild="Adept" guildId="38253" guildUrl="r=Draenor&n=Adept&p=1" name="Cake" race="Draenei" raceId="11" seasonGamesPlayed="1" seasonGamesWon="1" teamRank="1"/>
|
1287
|
-
#
|
1288
|
-
# <character battleGroup="" charUrl="r=Draenor&n=Efes" class="Druid" classId="11" contribution="1508" gamesPlayed="0" gamesWon="0" gender="Female" genderId="1" guild="Adept" guildId="38253" guildUrl="r=Draenor&n=Adept&p=1" name="Efes" race="Night Elf" raceId="4" seasonGamesPlayed="13" seasonGamesWon="7" teamRank="1"/>
|
1289
|
-
# <character battleGroup="" charUrl="r=Draenor&n=Lothaar" class="Paladin" classId="2" contribution="1602" gamesPlayed="10" gamesWon="7" gender="Male" genderId="0" guild="Ultimo Impero Oscuro" guildId="37203" guildUrl="r=Draenor&n=Ultimo+Impero+Oscuro&p=1" name="Lothaar" race="Human" raceId="1" seasonGamesPlayed="20" seasonGamesWon="13" teamRank="1"/>
|
1290
|
-
# <character battleGroup="" charUrl="r=Draenor&n=Lothaar" class="Paladin" classId="2" contribution="1602" gamesPlayed="10" gamesWon="7" gender="Male" genderId="0" guild="Passion" guildId="36659" guildUrl="r=Draenor&n=Passion&p=1" name="Lothaar" race="Human" raceId="1" seasonGamesPlayed="20" seasonGamesWon="13" teamRank="1"/>
|
1291
|
-
# </members>
|
1292
|
-
# </arenaTeam>
|
1293
|
-
# </arenaTeams>
|
1294
|
-
class ArenaTeam
|
1295
|
-
attr_reader :name, :size, :battle_group, :faction, :faction_id, :realm, :realm_url,
|
1296
|
-
:games_played, :games_won, :ranking, :rating,
|
1297
|
-
:season_games_played, :season_games_won, :last_season_ranking,
|
1298
|
-
:relevance, :url, :url_escape,
|
1299
|
-
:characters, # can be blank on search results
|
1300
|
-
:emblem
|
1301
|
-
|
1302
|
-
def initialize(elem)
|
1303
|
-
@name = elem[:name]
|
1304
|
-
@size = elem[:size].to_i
|
1305
|
-
@battle_group = elem[:battleGroup]
|
1306
|
-
@faction = elem[:faction]
|
1307
|
-
@faction_id = elem[:factionId].to_i
|
1308
|
-
@realm = elem[:realm]
|
1309
|
-
@realm_url = elem[:realmUrl]
|
1310
|
-
|
1311
|
-
@games_played = elem[:gamesPlayed].to_i
|
1312
|
-
@games_won = elem[:gamesWon].to_i
|
1313
|
-
@ranking = elem[:ranking].to_i
|
1314
|
-
@rating = elem[:rating].to_i
|
1315
|
-
|
1316
|
-
@season_games_played = elem[:seasonGamesPlayed].to_i
|
1317
|
-
@season_games_won = elem[:seasonGamesWon].to_i
|
1318
|
-
@last_season_ranking = elem[:lastSeasonRanking].to_i
|
1319
|
-
|
1320
|
-
@relevance = elem[:relevance].to_i
|
1321
|
-
@url = elem[:url]
|
1322
|
-
|
1323
|
-
@emblem = ArenaTeamEmblem.new(elem%'emblem')
|
1324
|
-
|
1325
|
-
@members = []
|
1326
|
-
(elem%'members'/:character).each do |character|
|
1327
|
-
@members << Character.new(character)
|
1328
|
-
end
|
1329
|
-
end
|
1330
|
-
end
|
1331
|
-
|
1332
|
-
class ArenaTeamEmblem
|
1333
|
-
attr_reader :background, :border_color, :border_style, :icon_colour, :icon_style
|
1334
|
-
|
1335
|
-
def initialize(elem)
|
1336
|
-
@background = elem[:background]
|
1337
|
-
@border_color = elem[:borderColor]
|
1338
|
-
@border_style = elem[:borderStyle].to_i
|
1339
|
-
@icon_color = elem[:iconColor]
|
1340
|
-
@icon_style = elem[:iconStyle].to_i
|
1341
|
-
end
|
1342
|
-
end
|
1343
|
-
|
1344
|
-
end
|
1345
|
-
end
|