dota 0.0.12 → 0.0.14

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