dota 0.0.12 → 0.0.14

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/Guardfile +1 -1
  3. data/README.md +145 -112
  4. data/data/heroes.yml +327 -0
  5. data/data/items.yml +714 -0
  6. data/lib/dota.rb +8 -1
  7. data/lib/dota/api/basic_match.rb +52 -0
  8. data/lib/dota/api/basic_player.rb +61 -0
  9. data/lib/dota/api/client.rb +12 -2
  10. data/lib/dota/api/cosmetic/rarity.rb +1 -9
  11. data/lib/dota/api/entity.rb +13 -0
  12. data/lib/dota/api/friend.rb +1 -9
  13. data/lib/dota/api/hero.rb +2 -111
  14. data/lib/dota/api/item.rb +1 -240
  15. data/lib/dota/api/league.rb +6 -8
  16. data/lib/dota/api/live_match.rb +29 -35
  17. data/lib/dota/api/live_match/player.rb +29 -22
  18. data/lib/dota/api/live_match/side.rb +25 -11
  19. data/lib/dota/api/match.rb +30 -117
  20. data/lib/dota/api/match/draft.rb +1 -9
  21. data/lib/dota/api/match/player.rb +7 -59
  22. data/lib/dota/api/match/side.rb +41 -0
  23. data/lib/dota/api/scheduled_match.rb +32 -0
  24. data/lib/dota/api/team.rb +1 -9
  25. data/lib/dota/version.rb +1 -1
  26. data/spec/dota/api/cosmetic/rarity_spec.rb +2 -2
  27. data/spec/dota/api/hero_spec.rb +2 -6
  28. data/spec/dota/api/item_spec.rb +1 -5
  29. data/spec/dota/api/live_match/player_spec.rb +76 -8
  30. data/spec/dota/api/live_match/side_spec.rb +42 -8
  31. data/spec/dota/api/live_match_spec.rb +5 -16
  32. data/spec/dota/api/match/draft_spec.rb +4 -1
  33. data/spec/dota/api/match/player_spec.rb +7 -3
  34. data/spec/dota/api/match/side_spec.rb +54 -0
  35. data/spec/dota/api/match_spec.rb +0 -62
  36. data/spec/dota/api/scheduled_match_spec.rb +36 -0
  37. data/spec/dota_spec.rb +56 -7
  38. data/spec/fixtures/vcr_cassettes/GetScheduledLeagueGames.yml +112 -0
  39. metadata +15 -5
  40. data/lib/dota/api/live_match/scoreboard.rb +0 -31
  41. data/spec/dota/api/live_match/scoreboard_spec.rb +0 -25
@@ -1,8 +1,14 @@
1
+ require 'yaml'
2
+
1
3
  require 'dota/configuration'
2
4
  require 'dota/version'
3
5
 
4
6
  require 'dota/utils/inspect'
5
7
 
8
+ require 'dota/api/entity'
9
+
10
+ require 'dota/api/basic_match'
11
+ require 'dota/api/basic_player'
6
12
  require 'dota/api/client'
7
13
  require 'dota/api/cosmetic/rarity'
8
14
  require 'dota/api/friend'
@@ -12,10 +18,11 @@ require 'dota/api/league'
12
18
  require 'dota/api/live_match'
13
19
  require 'dota/api/live_match/player'
14
20
  require 'dota/api/live_match/side'
15
- require 'dota/api/live_match/scoreboard'
16
21
  require 'dota/api/match'
17
22
  require 'dota/api/match/draft'
18
23
  require 'dota/api/match/player'
24
+ require 'dota/api/match/side'
25
+ require 'dota/api/scheduled_match'
19
26
  require 'dota/api/team'
20
27
 
21
28
  module Dota
@@ -0,0 +1,52 @@
1
+ module Dota
2
+ module API
3
+ class BasicMatch < Entity
4
+ include Utilities::Inspectable
5
+
6
+ TYPES = {
7
+ -1 => "Invalid",
8
+ 0 => "Public Matchmaking",
9
+ 1 => "Practice",
10
+ 2 => "Tournament",
11
+ 3 => "Tutorial",
12
+ 4 => "Co-op with Bots",
13
+ 5 => "Team Match",
14
+ 6 => "Solo Queue",
15
+ 7 => "Ranked"
16
+ }.freeze
17
+
18
+ MODES = {
19
+ 0 => "None",
20
+ 1 => "All Pick",
21
+ 2 => "Captain's Mode",
22
+ 3 => "Random Draft",
23
+ 4 => "Single Draft",
24
+ 5 => "All Random",
25
+ 6 => "Intro",
26
+ 7 => "Diretide",
27
+ 8 => "Reverse Captain's Mode",
28
+ 9 => "The Greeviling",
29
+ 10 => "Tutorial",
30
+ 11 => "Mid Only",
31
+ 12 => "Least Played",
32
+ 13 => "New Player Pool",
33
+ 14 => "Compendium Matchmaking",
34
+ 15 => "Custom",
35
+ 16 => "Captain's Draft",
36
+ 17 => "Balanced Draft",
37
+ 18 => "Ability Draft"
38
+ }.freeze
39
+
40
+ SKILL_LEVELS = {
41
+ 0 => "Any",
42
+ 1 => "Normal",
43
+ 2 => "High",
44
+ 3 => "Very High"
45
+ }.freeze
46
+
47
+ def id
48
+ raw["match_id"]
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,61 @@
1
+ module Dota
2
+ module API
3
+ class BasicPlayer < Entity
4
+ include Utilities::Inspectable
5
+
6
+ TYPES = {
7
+ 0 => :radiant,
8
+ 1 => :dire,
9
+ 2 => :broadcaster,
10
+ 4 => :unassigned
11
+ }
12
+
13
+ STATUS = {
14
+ 0 => :played,
15
+ 1 => :left_safe,
16
+ 2 => :abandoned,
17
+ 4 => :bot
18
+ }
19
+
20
+ def id
21
+ raw["account_id"]
22
+ end
23
+
24
+ def hero
25
+ Hero.new(raw["hero_id"])
26
+ end
27
+
28
+ def level
29
+ raw["level"]
30
+ end
31
+
32
+ def assists
33
+ raw["assists"]
34
+ end
35
+
36
+ def last_hits
37
+ raw["last_hits"]
38
+ end
39
+
40
+ def denies
41
+ raw["denies"]
42
+ end
43
+
44
+ def gold
45
+ raw["gold"]
46
+ end
47
+
48
+ def kills
49
+ raw["kills"]
50
+ end
51
+
52
+ def gpm
53
+ raw["gold_per_min"]
54
+ end
55
+
56
+ def xpm
57
+ raw["xp_per_min"]
58
+ end
59
+ end
60
+ end
61
+ end
@@ -65,13 +65,23 @@ module Dota
65
65
  end
66
66
  end
67
67
 
68
- def live_matches
69
- response = get("IDOTA2Match_570", "GetLiveLeagueGames")["result"]
68
+ def live_matches(options = {})
69
+ response = get("IDOTA2Match_570", "GetLiveLeagueGames", options)["result"]
70
70
  if response && (live_matches = response["games"])
71
71
  live_matches.map { |game| LiveMatch.new(game) }
72
72
  end
73
73
  end
74
74
 
75
+ def scheduled_matches(options = {})
76
+ options[:date_min] = options.delete(:from) if options[:from]
77
+ options[:date_max] = options.delete(:to) if options[:to]
78
+
79
+ response = get("IDOTA2Match_570", "GetScheduledLeagueGames", options)["result"]
80
+ if response && (scheduled_matches = response["games"])
81
+ scheduled_matches.map { |game| ScheduledMatch.new(game) }
82
+ end
83
+ end
84
+
75
85
  def cosmetic_rarities
76
86
  response = get("IEconDOTA2_570", "GetRarities", language: "en")["result"]
77
87
  if response && (rarities = response["rarities"])
@@ -1,15 +1,7 @@
1
1
  module Dota
2
2
  module API
3
3
  class Cosmetic
4
- class Rarity
5
- include Utilities::Inspectable
6
-
7
- attr_reader :raw
8
-
9
- def initialize(raw)
10
- @raw = raw
11
- end
12
-
4
+ class Rarity < Entity
13
5
  def id
14
6
  raw["id"]
15
7
  end
@@ -0,0 +1,13 @@
1
+ module Dota
2
+ module API
3
+ class Entity
4
+ include Utilities::Inspectable
5
+
6
+ attr_reader :raw
7
+
8
+ def initialize(raw)
9
+ @raw = raw
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,14 +1,6 @@
1
1
  module Dota
2
2
  module API
3
- class Friend
4
- include Utilities::Inspectable
5
-
6
- attr_reader :raw
7
-
8
- def initialize(raw)
9
- @raw = raw
10
- end
11
-
3
+ class Friend < Entity
12
4
  def id
13
5
  raw["steamid"].to_i
14
6
  end
@@ -1,121 +1,12 @@
1
1
  module Dota
2
2
  module API
3
3
  class Hero
4
- MAPPING = {
5
- 1 => ["antimage", "Anti-Mage"],
6
- 2 => ["axe", "Axe"],
7
- 3 => ["bane", "Bane"],
8
- 4 => ["bloodseeker", "Bloodseeker"],
9
- 5 => ["crystal_maiden", "Crystal Maiden"],
10
- 6 => ["drow_ranger", "Drow Ranger"],
11
- 7 => ["earthshaker", "Earthshaker"],
12
- 8 => ["juggernaut", "Juggernaut"],
13
- 9 => ["mirana", "Mirana"],
14
- 10 => ["morphling", "Morphling"],
15
- 11 => ["nevermore", "Shadow Fiend"],
16
- 12 => ["phantom_lancer", "Phantom Lancer"],
17
- 13 => ["puck", "Puck"],
18
- 14 => ["pudge", "Pudge"],
19
- 15 => ["razor", "Razor"],
20
- 16 => ["sand_king", "Sand King"],
21
- 17 => ["storm_spirit", "Storm Spirit"],
22
- 18 => ["sven", "Sven"],
23
- 19 => ["tiny", "Tiny"],
24
- 20 => ["vengefulspirit", "Vengeful Spirit"],
25
- 21 => ["windrunner", "Windranger"],
26
- 22 => ["zuus", "Zeus"],
27
- 23 => ["kunkka", "Kunkka"],
28
- 25 => ["lina", "Lina"],
29
- 26 => ["lion", "Lion"],
30
- 27 => ["shadow_shaman", "Shadow Shaman"],
31
- 28 => ["slardar", "Slardar"],
32
- 29 => ["tidehunter", "Tidehunter"],
33
- 30 => ["witch_doctor", "Witch Doctor"],
34
- 31 => ["lich", "Lich"],
35
- 32 => ["riki", "Riki"],
36
- 33 => ["enigma", "Enigma"],
37
- 34 => ["tinker", "Tinker"],
38
- 35 => ["sniper", "Sniper"],
39
- 36 => ["necrolyte", "Necrophos"],
40
- 37 => ["warlock", "Warlock"],
41
- 38 => ["beastmaster", "Beastmaster"],
42
- 39 => ["queenofpain", "Queen of Pain"],
43
- 40 => ["venomancer", "Venomancer"],
44
- 41 => ["faceless_void", "Faceless Void"],
45
- 42 => ["skeleton_king", "Wraith King"],
46
- 43 => ["death_prophet", "Death Prophet"],
47
- 44 => ["phantom_assassin", "Phantom Assassin"],
48
- 45 => ["pugna", "Pugna"],
49
- 46 => ["templar_assassin", "Templar Assassin"],
50
- 47 => ["viper", "Viper"],
51
- 48 => ["luna", "Luna"],
52
- 49 => ["dragon_knight", "Dragon Knight"],
53
- 50 => ["dazzle", "Dazzle"],
54
- 51 => ["rattletrap", "Clockwerk"],
55
- 52 => ["leshrac", "Leshrac"],
56
- 53 => ["furion", "Nature's Prophet"],
57
- 54 => ["life_stealer", "Lifestealer"],
58
- 55 => ["dark_seer", "Dark Seer"],
59
- 56 => ["clinkz", "Clinkz"],
60
- 57 => ["omniknight", "Omniknight"],
61
- 58 => ["enchantress", "Enchantress"],
62
- 59 => ["huskar", "Huskar"],
63
- 60 => ["night_stalker", "Night Stalker"],
64
- 61 => ["broodmother", "Broodmother"],
65
- 62 => ["bounty_hunter", "Bounty Hunter"],
66
- 63 => ["weaver", "Weaver"],
67
- 64 => ["jakiro", "Jakiro"],
68
- 65 => ["batrider", "Batrider"],
69
- 66 => ["chen", "Chen"],
70
- 67 => ["spectre", "Spectre"],
71
- 68 => ["ancient_apparition", "Ancient Apparition"],
72
- 69 => ["doom_bringer", "Doom"],
73
- 70 => ["ursa", "Ursa"],
74
- 71 => ["spirit_breaker", "Spirit Breaker"],
75
- 72 => ["gyrocopter", "Gyrocopter"],
76
- 73 => ["alchemist", "Alchemist"],
77
- 74 => ["invoker", "Invoker"],
78
- 75 => ["silencer", "Silencer"],
79
- 76 => ["obsidian_destroyer", "Outworld Devourer"],
80
- 77 => ["lycan", "Lycan"],
81
- 78 => ["brewmaster", "Brewmaster"],
82
- 79 => ["shadow_demon", "Shadow Demon"],
83
- 80 => ["lone_druid", "Lone Druid"],
84
- 81 => ["chaos_knight", "Chaos Knight"],
85
- 82 => ["meepo", "Meepo"],
86
- 83 => ["treant", "Treant Protector"],
87
- 84 => ["ogre_magi", "Ogre Magi"],
88
- 85 => ["undying", "Undying"],
89
- 86 => ["rubick", "Rubick"],
90
- 87 => ["disruptor", "Disruptor"],
91
- 88 => ["nyx_assassin", "Nyx Assassin"],
92
- 89 => ["naga_siren", "Naga Siren"],
93
- 90 => ["keeper_of_the_light", "Keeper of the Light"],
94
- 91 => ["wisp", "Io"],
95
- 92 => ["visage", "Visage"],
96
- 93 => ["slark", "Slark"],
97
- 94 => ["medusa", "Medusa"],
98
- 95 => ["troll_warlord", "Troll Warlord"],
99
- 96 => ["centaur", "Centaur Warrunner"],
100
- 97 => ["magnataur", "Magnus"],
101
- 98 => ["shredder", "Timbersaw"],
102
- 99 => ["bristleback", "Bristleback"],
103
- 100 => ["tusk", "Tusk"],
104
- 101 => ["skywrath_mage", "Skywrath Mage"],
105
- 102 => ["abaddon", "Abaddon"],
106
- 103 => ["elder_titan", "Elder Titan"],
107
- 104 => ["legion_commander", "Legion Commander"],
108
- 105 => ["techies", "Techies"],
109
- 106 => ["ember_spirit", "Ember Spirit"],
110
- 107 => ["earth_spirit", "Earth Spirit"],
111
- 109 => ["terrorblade", "Terrorblade"],
112
- 110 => ["phoenix", "Phoenix"]
113
- }.freeze
4
+ MAPPING = YAML.load_file("data/heroes.yml").freeze
114
5
 
115
6
  attr_reader :id, :name
116
7
 
117
8
  def self.all
118
- MAPPING.keys.map { |id| new(id) }
9
+ @all ||= MAPPING.keys.map { |id| new(id) }
119
10
  end
120
11
 
121
12
  def initialize(id)
@@ -1,246 +1,7 @@
1
1
  module Dota
2
2
  module API
3
3
  class Item
4
- MAPPING = {
5
- 0 => ["empty", "Empty"],
6
- 1 => ["blink", "Blink Dagger"],
7
- 2 => ["blades_of_attack", "Blades of Attack"],
8
- 3 => ["broadsword", "Broadsword"],
9
- 4 => ["chainmail", "Chainmail"],
10
- 5 => ["claymore", "Claymore"],
11
- 6 => ["helm_of_iron_will", "Helm of Iron Will"],
12
- 7 => ["javelin", "Javelin"],
13
- 8 => ["mithril_hammer", "Mithril Hammer"],
14
- 9 => ["platemail", "Platemail"],
15
- 10 => ["quarterstaff", "Quarterstaff"],
16
- 11 => ["quelling_blade", "Quelling Blade"],
17
- 12 => ["ring_of_protection", "Ring of Protection"],
18
- 13 => ["gauntlets", "Gauntlets of Strength"],
19
- 14 => ["slippers", "Slippers of Agility"],
20
- 15 => ["mantle", "Mantle of Intelligence"],
21
- 16 => ["branches", "Iron Branch"],
22
- 17 => ["belt_of_strength", "Belt of Strength"],
23
- 18 => ["boots_of_elves", "Band of Elvenskin"],
24
- 19 => ["robe", "Robe of the Magi"],
25
- 20 => ["circlet", "Circlet"],
26
- 21 => ["ogre_axe", "Ogre Club"],
27
- 22 => ["blade_of_alacrity", "Blade of Alacrity"],
28
- 23 => ["staff_of_wizardry", "Staff of Wizardry"],
29
- 24 => ["ultimate_orb", "Ultimate Orb"],
30
- 25 => ["gloves", "Gloves of Haste"],
31
- 26 => ["lifesteal", "Morbid Mask"],
32
- 27 => ["ring_of_regen", "Ring of Regen"],
33
- 28 => ["sobi_mask", "Sage's Mask"],
34
- 29 => ["boots", "Boots of Speed"],
35
- 30 => ["gem", "Gem of True Sight"],
36
- 31 => ["cloak", "Cloak"],
37
- 32 => ["talisman_of_evasion", "Talisman of Evasion"],
38
- 33 => ["cheese", "Cheese"],
39
- 34 => ["magic_stick", "Magic Stick"],
40
- 35 => ["recipe_magic_wand", "Recipe: Magic Wand"],
41
- 36 => ["magic_wand", "Magic Wand"],
42
- 37 => ["ghost", "Ghost Scepter"],
43
- 38 => ["clarity", "Clarity"],
44
- 39 => ["flask", "Healing Salve"],
45
- 40 => ["dust", "Dust of Appearance"],
46
- 41 => ["bottle", "Bottle"],
47
- 42 => ["ward_observer", "Observer Ward"],
48
- 43 => ["ward_sentry", "Sentry Ward"],
49
- 44 => ["tango", "Tango"],
50
- 45 => ["courier", "Animal Courier"],
51
- 46 => ["tpscroll", "Town Portal Scroll"],
52
- 47 => ["recipe_travel_boots", "Recipe: Boots of Travel"],
53
- 48 => ["travel_boots", "Boots of Travel"],
54
- 49 => ["recipe_phase_boots", "Recipe: Phase Boots"],
55
- 50 => ["phase_boots", "Phase Boots"],
56
- 51 => ["demon_edge", "Demon Edge"],
57
- 52 => ["eagle", "Eaglesong"],
58
- 53 => ["reaver", "Reaver"],
59
- 54 => ["relic", "Sacred Relic"],
60
- 55 => ["hyperstone", "Hyperstone"],
61
- 56 => ["ring_of_health", "Ring of Health"],
62
- 57 => ["void_stone", "Void Stone"],
63
- 58 => ["mystic_staff", "Mystic Staff"],
64
- 59 => ["energy_booster", "Energy Booster"],
65
- 60 => ["point_booster", "Point Booster"],
66
- 61 => ["vitality_booster", "Vitality Booster"],
67
- 62 => ["recipe_power_treads", "Recipe: Power Treads"],
68
- 63 => ["power_treads", "Power Treads"],
69
- 64 => ["recipe_hand_of_midas", "Recipe: Hand of Midas"],
70
- 65 => ["hand_of_midas", "Hand of Midas"],
71
- 66 => ["recipe_oblivion_staff", "Recipe: Oblivion Staff"],
72
- 67 => ["oblivion_staff", "Oblivion Staff"],
73
- 68 => ["recipe_pers", "Recipe: Perseverance"],
74
- 69 => ["pers", "Perseverance"],
75
- 70 => ["recipe_poor_mans_shield", "Recipe: Poor Man's Shield"],
76
- 71 => ["poor_mans_shield", "Poor Man's Shield"],
77
- 72 => ["recipe_bracer", "Recipe: Bracer"],
78
- 73 => ["bracer", "Bracer"],
79
- 74 => ["recipe_wraith_band", "Recipe: Wraith Band"],
80
- 75 => ["wraith_band", "Wraith Band"],
81
- 76 => ["recipe_null_talisman", "Recipe: Null Talisman"],
82
- 77 => ["null_talisman", "Null Talisman"],
83
- 78 => ["recipe_mekansm", "Recipe: Mekansm"],
84
- 79 => ["mekansm", "Mekansm"],
85
- 80 => ["recipe_vladmir", "Recipe: Vladmir's Offering"],
86
- 81 => ["vladmir", "Vladmir's Offering"],
87
- 84 => ["flying_courier", "Flying Courier"],
88
- 85 => ["recipe_buckler", "Recipe: Buckler"],
89
- 86 => ["buckler", "Buckler"],
90
- 87 => ["recipe_ring_of_basilius", "Recipe: Ring of Basilius"],
91
- 88 => ["ring_of_basilius", "Ring of Basilius"],
92
- 89 => ["recipe_pipe", "Recipe: Pipe of Insight"],
93
- 90 => ["pipe", "Pipe of Insight"],
94
- 91 => ["recipe_urn_of_shadows", "Recipe: Urn of Shadows"],
95
- 92 => ["urn_of_shadows", "Urn of Shadows"],
96
- 93 => ["recipe_headdress", "Recipe: Headdress"],
97
- 94 => ["headdress", "Headdress"],
98
- 95 => ["recipe_sheepstick", "Recipe: Scythe of Vyse"],
99
- 96 => ["sheepstick", "Scythe of Vyse"],
100
- 97 => ["recipe_orchid", "Recipe: Orchid Malevolence"],
101
- 98 => ["orchid", "Orchid Malevolence"],
102
- 99 => ["recipe_cyclone", "Recipe: Eul's Scepter of Divinity"],
103
- 100 => ["cyclone", "Eul's Scepter of Divinity"],
104
- 101 => ["recipe_force_staff", "Recipe: Force Staff"],
105
- 102 => ["force_staff", "Force Staff"],
106
- 103 => ["recipe_dagon", "Recipe: Dagon"],
107
- 104 => ["dagon", "Dagon"],
108
- 105 => ["recipe_necronomicon", "Recipe: Necronomicon"],
109
- 106 => ["necronomicon", "Necronomicon"],
110
- 107 => ["recipe_ultimate_scepter", "Recipe: Aghanim's Scepter"],
111
- 108 => ["ultimate_scepter", "Aghanim's Scepter"],
112
- 109 => ["recipe_refresher", "Recipe: Refresher Orb"],
113
- 110 => ["refresher", "Refresher Orb"],
114
- 111 => ["recipe_assault", "Recipe: Assault Cuirass"],
115
- 112 => ["assault", "Assault Cuirass"],
116
- 113 => ["recipe_heart", "Recipe: Heart of Tarrasque"],
117
- 114 => ["heart", "Heart of Tarrasque"],
118
- 115 => ["recipe_black_king_bar", "Recipe: Black King Bar"],
119
- 116 => ["black_king_bar", "Black King Bar"],
120
- 117 => ["aegis", "Aegis of the Immortal"],
121
- 118 => ["recipe_shivas_guard", "Recipe: Shiva's Guard"],
122
- 119 => ["shivas_guard", "Shiva's Guard"],
123
- 120 => ["recipe_bloodstone", "Recipe: Bloodstone"],
124
- 121 => ["bloodstone", "Bloodstone"],
125
- 122 => ["recipe_sphere", "Recipe: Linken's Sphere"],
126
- 123 => ["sphere", "Linken's Sphere"],
127
- 124 => ["recipe_vanguard", "Recipe: Vanguard"],
128
- 125 => ["vanguard", "Vanguard"],
129
- 126 => ["recipe_blade_mail", "Recipe: Blade Mail"],
130
- 127 => ["blade_mail", "Blade Mail"],
131
- 128 => ["recipe_soul_booster", "Recipe: Soul Booster"],
132
- 129 => ["soul_booster", "Soul Booster"],
133
- 130 => ["recipe_hood_of_defiance", "Recipe: Hood of Defiance"],
134
- 131 => ["hood_of_defiance", "Hood of Defiance"],
135
- 132 => ["recipe_rapier", "Recipe: Divine Rapier"],
136
- 133 => ["rapier", "Divine Rapier"],
137
- 134 => ["recipe_monkey_king_bar", "Recipe: Monkey King Bar"],
138
- 135 => ["monkey_king_bar", "Monkey King Bar"],
139
- 136 => ["recipe_radiance", "Recipe: Radiance"],
140
- 137 => ["radiance", "Radiance"],
141
- 138 => ["recipe_butterfly", "Recipe: Butterfly"],
142
- 139 => ["butterfly", "Butterfly"],
143
- 140 => ["recipe_greater_crit", "Recipe: Daedalus"],
144
- 141 => ["greater_crit", "Daedalus"],
145
- 142 => ["recipe_basher", "Recipe: Skull Basher"],
146
- 143 => ["basher", "Skull Basher"],
147
- 144 => ["recipe_bfury", "Recipe: Battle Fury"],
148
- 145 => ["bfury", "Battle Fury"],
149
- 146 => ["recipe_manta", "Recipe: Manta Style"],
150
- 147 => ["manta", "Manta Style"],
151
- 148 => ["recipe_lesser_crit", "Recipe: Crystalys"],
152
- 149 => ["lesser_crit", "Crystalys"],
153
- 150 => ["recipe_armlet", "Recipe: Armlet of Mordiggian"],
154
- 151 => ["armlet", "Armlet of Mordiggian"],
155
- 152 => ["invis_sword", "Shadow Blade"],
156
- 153 => ["recipe_sange_and_yasha", "Recipe: Sange and Yasha"],
157
- 154 => ["sange_and_yasha", "Sange and Yasha"],
158
- 155 => ["recipe_satanic", "Recipe: Satanic"],
159
- 156 => ["satanic", "Satanic"],
160
- 157 => ["recipe_mjollnir", "Recipe: Mjollnir"],
161
- 158 => ["mjollnir", "Mjollnir"],
162
- 159 => ["recipe_skadi", "Recipe: Eye of Skadi"],
163
- 160 => ["skadi", "Eye of Skadi"],
164
- 161 => ["recipe_sange", "Recipe: Sange"],
165
- 162 => ["sange", "Sange"],
166
- 163 => ["recipe_helm_of_the_dominator", "Recipe: Helm of the Dominator"],
167
- 164 => ["helm_of_the_dominator", "Helm of the Dominator"],
168
- 165 => ["recipe_maelstrom", "Recipe: Maelstrom"],
169
- 166 => ["maelstrom", "Maelstrom"],
170
- 167 => ["recipe_desolator", "Recipe: Desolator"],
171
- 168 => ["desolator", "Desolator"],
172
- 169 => ["recipe_yasha", "Recipe: Yasha"],
173
- 170 => ["yasha", "Yasha"],
174
- 171 => ["recipe_mask_of_madness", "Recipe: Mask of Madness"],
175
- 172 => ["mask_of_madness", "Mask of Madness"],
176
- 173 => ["recipe_diffusal_blade", "Recipe: Diffusal Blade"],
177
- 174 => ["diffusal_blade", "Diffusal Blade"],
178
- 175 => ["recipe_ethereal_blade", "Recipe: Ethereal Blade"],
179
- 176 => ["ethereal_blade", "Ethereal Blade"],
180
- 177 => ["recipe_soul_ring", "Recipe: Soul Ring"],
181
- 178 => ["soul_ring", "Soul Ring"],
182
- 179 => ["recipe_arcane_boots", "Recipe: Arcane Boots"],
183
- 180 => ["arcane_boots", "Arcane Boots"],
184
- 181 => ["orb_of_venom", "Orb of Venom"],
185
- 182 => ["stout_shield", "Stout Shield"],
186
- 183 => ["recipe_invis_sword", "Recipe: Shadow Blade"],
187
- 184 => ["recipe_ancient_janggo", "Recipe: Drum of Endurance"],
188
- 185 => ["ancient_janggo", "Drum of Endurance"],
189
- 186 => ["recipe_medallion_of_courage", "Recipe: Medallion of Courage"],
190
- 187 => ["medallion_of_courage", "Medallion of Courage"],
191
- 188 => ["smoke_of_deceit", "Smoke of Deceit"],
192
- 189 => ["recipe_veil_of_discord", "Recipe: Veil of Discord"],
193
- 190 => ["veil_of_discord", "Veil of Discord"],
194
- 191 => ["recipe_necronomicon_2", "Recipe: Necronomicon"],
195
- 192 => ["recipe_necronomicon_3", "Recipe: Necronomicon"],
196
- 193 => ["necronomicon_2", "Necronomicon"],
197
- 194 => ["necronomicon_3", "Necronomicon"],
198
- 195 => ["recipe_diffusal_blade_2", "Recipe: Diffusal Blade"],
199
- 196 => ["diffusal_blade_2", "Diffusal Blade"],
200
- 197 => ["recipe_dagon_2", "Recipe: Dagon"],
201
- 198 => ["recipe_dagon_3", "Recipe: Dagon"],
202
- 199 => ["recipe_dagon_4", "Recipe: Dagon"],
203
- 200 => ["recipe_dagon_5", "Recipe: Dagon"],
204
- 201 => ["dagon_2", "Dagon"],
205
- 202 => ["dagon_3", "Dagon"],
206
- 203 => ["dagon_4", "Dagon"],
207
- 204 => ["dagon_5", "Dagon"],
208
- 205 => ["recipe_rod_of_atos", "Recipe: Rod of Atos"],
209
- 206 => ["rod_of_atos", "Rod of Atos"],
210
- 207 => ["recipe_abyssal_blade", "Recipe: Abyssal Blade"],
211
- 208 => ["abyssal_blade", "Abyssal Blade"],
212
- 209 => ["recipe_heavens_halberd", "Recipe: Heaven's Halberd"],
213
- 210 => ["heavens_halberd", "Heaven's Halberd"],
214
- 211 => ["recipe_ring_of_aquila", "Recipe: Ring of Aquila"],
215
- 212 => ["ring_of_aquila", "Ring of Aquila"],
216
- 213 => ["recipe_tranquil_boots", "Recipe: Tranquil Boots"],
217
- 214 => ["tranquil_boots", "Tranquil Boots"],
218
- 215 => ["shadow_amulet", "Shadow Amulet"],
219
- 216 => ["halloween_candy_corn", "Greevil Taffy"],
220
- 217 => ["mystery_hook", "DOTA_Tooltip_Ability_item_mystery_hook"],
221
- 218 => ["mystery_arrow", "DOTA_Tooltip_Ability_item_mystery_arrow"],
222
- 219 => ["mystery_missile", "DOTA_Tooltip_Ability_item_mystery_missile"],
223
- 220 => ["mystery_toss", "DOTA_Tooltip_Ability_item_mystery_toss"],
224
- 221 => ["mystery_vacuum", "DOTA_Tooltip_Ability_item_mystery_vacuum"],
225
- 226 => ["halloween_rapier", "DOTA_Tooltip_Ability_item_halloween_rapier"],
226
- 227 => ["present", "A Gift!"],
227
- 228 => ["greevil_whistle", "Greevil Whistle"],
228
- 229 => ["winter_stocking", "Xmas Stocking"],
229
- 230 => ["winter_skates", "Speed Skates"],
230
- 231 => ["winter_cake", "Fruit-bit Cake"],
231
- 232 => ["winter_cookie", "Wizard Cookie"],
232
- 233 => ["winter_coco", "Cocoa with Marshmallows"],
233
- 234 => ["winter_ham", "Clove Studded Ham"],
234
- 235 => ["greevil_whistle_toggle", "Greevil Whistle"],
235
- 236 => ["winter_kringle", "Kringle"],
236
- 237 => ["winter_mushroom", "Snow Mushroom"],
237
- 238 => ["winter_greevil_treat", "Greevil Treat"],
238
- 239 => ["winter_greevil_garbage", "Greevil Chow"],
239
- 240 => ["winter_greevil_chewy", "Greevil Blink Bone"],
240
- 241 => ["tango_single", "Tango (Shared)"],
241
- 242 => ["crimson_guard", "Crimson Guard"],
242
- 243 => ["recipe_crimson_guard", "Recipe: Crimson Guard"],
243
- }.freeze
4
+ MAPPING = YAML.load_file("data/items.yml").freeze
244
5
 
245
6
  attr_reader :id, :name
246
7