ascension 0.1.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.
@@ -0,0 +1,225 @@
1
+ require File.dirname(__FILE__) + "/spec_helper"
2
+
3
+ if false
4
+ describe 'word' do
5
+ describe 'first_lifebound_hero_played' do
6
+ before do
7
+ @raw = "first_lifebound_hero_played"
8
+ @word = Parse::Word.parsed(:raw => @raw)
9
+ end
10
+ it 'should be first' do
11
+ @word.should be_first
12
+ end
13
+ it 'should have realm' do
14
+ @word.realm.should == 'lifebound'
15
+ end
16
+ it 'should have type' do
17
+ @word.type.should == "hero_played"
18
+ end
19
+ end
20
+ describe 'lifebound_hero_played' do
21
+ before do
22
+ @raw = "lifebound_hero_played"
23
+ @word = Parse::Word.parsed(:raw => @raw)
24
+ end
25
+ it 'should not be first' do
26
+ @word.should_not be_first
27
+ end
28
+ it 'should have realm' do
29
+ @word.realm.should == 'lifebound'
30
+ end
31
+ it 'should have type' do
32
+ @word.type.should == "hero_played"
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ describe 'word' do
39
+ before do
40
+ @side = Side.new
41
+ @card = Card::Hero.new(:realm => :lifebound)
42
+ @event = Event::CardPlayed.new(:card => @card)
43
+ @word = Parse::Word.new(:raw => "lifebound_hero_played")
44
+ end
45
+ it 'should be true' do
46
+ @side.events << @event
47
+ @word.should be_occured(@side)
48
+ end
49
+ it 'should be false' do
50
+ @word.should_not be_occured(@side)
51
+ end
52
+ end
53
+
54
+ describe 'phrase' do
55
+ before do
56
+ @side = Side.new
57
+ @card = Card::Hero.new(:realm => :lifebound)
58
+ @event = Event::CardPlayed.new(:card => @card, :first => true)
59
+ end
60
+
61
+ describe 'on' do
62
+ fattr(:phrase) do
63
+ Parse::Phrase.parsed(@raw).tap { |x| x.category = @category }
64
+ end
65
+ before do
66
+ @raw = "1 on first_lifebound_hero_played"
67
+ @category = :add_honor
68
+ end
69
+ it 'execute trigger' do
70
+ phrase.trigger.call(@event, @side)
71
+ @side.honor.should == 1
72
+ end
73
+ it 'execute trigger' do
74
+ @raw = "2 on first_lifebound_hero_played"
75
+ phrase.trigger.call(@event, @side)
76
+ @side.honor.should == 2
77
+ end
78
+ it 'shouldnt run' do
79
+ @card.realm = :mechana
80
+ phrase.trigger.call(@event, @side)
81
+ @side.honor.should == 0
82
+ end
83
+ it 'should add trigger to card' do
84
+ phrase.mod_card(@card)
85
+ @card.triggers.size.should == 1
86
+ end
87
+ end
88
+ if true
89
+ describe 'if' do
90
+ before do
91
+ @side = Side.new
92
+ @card = Card::Hero.new(:realm => :lifebound)
93
+ @event = Event::CardPlayed.new(:card => @card)
94
+
95
+ @phrase = Parse::Phrase.parsed("1 if lifebound_hero_played").tap { |x| x.category = :add_honor }
96
+ end
97
+
98
+ it 'foo' do
99
+ @phrase.mod_card(@card)
100
+ @card.abilities.size.should == 1
101
+
102
+ @side.events << @event
103
+
104
+ @card.apply_abilities(@side)
105
+ @side.honor.should == 1
106
+ end
107
+ end
108
+ end
109
+
110
+ describe 'Card' do
111
+ before do
112
+ @side = Side.new
113
+ @first_card = Card::Hero.new(:realm => :lifebound)
114
+ @parse_card = Parse::Card.new(:rune_cost => 2, :honor_given => "1 if lifebound_hero_played", :runes => "1")
115
+ end
116
+ it 'should make card - smoke' do
117
+ @parse_card.card
118
+ end
119
+ it 'card should add honor' do
120
+ @side.played << @first_card
121
+ @side.played << @parse_card.card
122
+ @side.honor.should == 1
123
+ end
124
+ it 'card should not add honor' do
125
+ @side.played << @parse_card.card
126
+ @side.honor.should == 0
127
+ end
128
+ it 'card gives 1 rune' do
129
+ @side.played << @parse_card.card
130
+ @side.played.pool.runes.should == 1
131
+ end
132
+ it 'card gives 1 mech rune' do
133
+ @parse_card.runes = "1 for mechana"
134
+ @side.played << @parse_card.card
135
+ @side.played.pool.mechana_runes.should == 1
136
+ end
137
+ it 'card gives 1 normal, 1 mech rune' do
138
+ @parse_card.runes = "1,1 for mechana"
139
+ @side.played << @parse_card.card
140
+ @side.played.pool.runes.should == 1
141
+ @side.played.pool.mechana_runes.should == 1
142
+ end
143
+ it 'draws 1' do
144
+ @parse_card.draw = "1"
145
+ @side.played << @parse_card.card
146
+ @side.hand.size.should == 1
147
+ end
148
+ it 'draws 1 cond' do
149
+ @parse_card.draw = "1 if two_or_more_constructs"
150
+ @side.played << @parse_card.card
151
+ @side.hand.size.should == 0
152
+ end
153
+ it 'draws 1 cond' do
154
+ @parse_card.draw = "1 if two_or_more_constructs"
155
+ stub(@side.constructs).size { 2 }
156
+ @side.played << @parse_card.card
157
+ @side.hand.size.should == 1
158
+ end
159
+ end
160
+
161
+ describe 'banish' do
162
+ before do
163
+ @game, @side = *new_game_with_side
164
+ @game.center.fill!
165
+
166
+ @card = @game.center.first
167
+
168
+ @parse_card = Parse::Card.new(:banish_center => "1")
169
+ end
170
+ it 'should banish a card' do
171
+ stub(Ability::CardChoice).chooser do
172
+ lambda { |c| c.options.first }
173
+ end
174
+
175
+ @game.void.size.should == 0
176
+ @parse_card.card.apply_abilities(@side)
177
+ @game.void.size.should == 1
178
+ end
179
+ it 'should not banish a card' do
180
+ @parse_card.banish_center = "o1"
181
+ stub(Ability::CardChoice).chooser do
182
+ lambda { |c| nil }
183
+ end
184
+
185
+ @game.void.size.should == 0
186
+ @parse_card.card.apply_abilities(@side)
187
+ @game.void.size.should == 0
188
+ end
189
+ end
190
+
191
+ describe 'kill monster' do
192
+ before do
193
+ @game, @side = *new_game_with_side
194
+ @game.center << Card::Monster.cultist
195
+ @parse_card = Parse::Card.new(:special_abilities => "kill_monster_4")
196
+ end
197
+ it 'should add ability' do
198
+ @parse_card.card.abilities.size.should == 1
199
+ end
200
+ it 'ability should kill' do
201
+ stub(Ability::CardChoice).chooser do
202
+ lambda { |c| c.options.first }
203
+ end
204
+ @parse_card.card.apply_abilities(@side)
205
+ @side.honor.should == 1
206
+ end
207
+ end
208
+ end
209
+
210
+ describe 'input file' do
211
+ before do
212
+ @file = Parse::InputFile.new
213
+ end
214
+ it 'smoke' do
215
+ @file.lines.size.should == 48
216
+ end
217
+ it 'smoke2' do
218
+ @file.cards.size.should == 100
219
+ end
220
+ end
221
+
222
+ str = "
223
+ on is a trigger
224
+ if is a conditional ability
225
+ for is a rune type"
@@ -0,0 +1,73 @@
1
+ require 'rubygems'
2
+ require 'spork'
3
+
4
+ class Array
5
+ def reduce(*args,&b)
6
+ inject(*args,&b)
7
+ end
8
+ end
9
+
10
+ class MMIgnore
11
+ def method_missing(sym,*args,&b)
12
+ self
13
+ end
14
+ end
15
+
16
+ class Object
17
+ def mm_ignore
18
+ MMIgnore.new
19
+ end
20
+ end
21
+
22
+
23
+ Spork.prefork do
24
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
25
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
26
+
27
+ require 'rspec'
28
+ require 'rr'
29
+ #require 'choice'
30
+
31
+
32
+ # Requires supporting files with custom matchers and macros, etc,
33
+ # in ./support/ and its subdirectories.
34
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
35
+
36
+ RSpec.configure do |config|
37
+ config.mock_with :rr
38
+ end
39
+ end
40
+
41
+ Spork.each_run do
42
+ load File.dirname(__FILE__) + "/../lib/ascension.rb"
43
+
44
+ def db
45
+ Mongo::Connection.new.db('ascension-test')
46
+ end
47
+
48
+ class CenterDeck < Cards
49
+ def self.starting
50
+ res = CenterDeck.new
51
+ 100.times { res << Card::Hero.standin }
52
+ res
53
+ end
54
+ end
55
+ end
56
+
57
+ def new_game_with_side
58
+ game = Game.new
59
+ side = Side.new(:game => game)
60
+ game.sides << side
61
+ [game,side]
62
+ end
63
+
64
+ def new_game_with_sides
65
+ game = Game.new
66
+ side = Side.new(:game => game)
67
+ game.sides << side
68
+ other = Side.new(:game => game)
69
+ game.sides << other
70
+ [game,side]
71
+ end
72
+
73
+
@@ -0,0 +1,556 @@
1
+ {"sides"=>
2
+ [{"discard"=>{"cards"=>[], "_mongo_class"=>"Discard"},
3
+ "deck"=>
4
+ {"cards"=>
5
+ [{"name"=>"Apprentice",
6
+ "runes"=>1,
7
+ "power"=>0,
8
+ "_mongo_class"=>"Card::Hero"},
9
+ {"name"=>"Apprentice",
10
+ "runes"=>1,
11
+ "power"=>0,
12
+ "_mongo_class"=>"Card::Hero"},
13
+ {"name"=>"Apprentice",
14
+ "runes"=>1,
15
+ "power"=>0,
16
+ "_mongo_class"=>"Card::Hero"},
17
+ {"name"=>"Apprentice",
18
+ "runes"=>1,
19
+ "power"=>0,
20
+ "_mongo_class"=>"Card::Hero"},
21
+ {"name"=>"Apprentice",
22
+ "runes"=>1,
23
+ "power"=>0,
24
+ "_mongo_class"=>"Card::Hero"}],
25
+ "_mongo_class"=>"PlayerDeck"},
26
+ "hand"=>
27
+ {"cards"=>
28
+ [{"name"=>"Apprentice",
29
+ "runes"=>1,
30
+ "power"=>0,
31
+ "_mongo_class"=>"Card::Hero"},
32
+ {"name"=>"Militia",
33
+ "runes"=>0,
34
+ "power"=>1,
35
+ "_mongo_class"=>"Card::Hero"},
36
+ {"name"=>"Militia",
37
+ "runes"=>0,
38
+ "power"=>1,
39
+ "_mongo_class"=>"Card::Hero"},
40
+ {"name"=>"Apprentice",
41
+ "runes"=>1,
42
+ "power"=>0,
43
+ "_mongo_class"=>"Card::Hero"},
44
+ {"name"=>"Apprentice",
45
+ "runes"=>1,
46
+ "power"=>0,
47
+ "_mongo_class"=>"Card::Hero"}],
48
+ "_mongo_class"=>"Hand"},
49
+ "played"=>
50
+ {"cards"=>[],
51
+ "pool"=>
52
+ {"runes"=>0,
53
+ "mechana_runes"=>0,
54
+ "construct_runes"=>0,
55
+ "power"=>0,
56
+ "_mongo_class"=>"Pool"},
57
+ "_mongo_class"=>"Played"},
58
+ "constructs"=>{"cards"=>[], "_mongo_class"=>"Constructs"},
59
+ "honor"=>0,
60
+ "_mongo_class"=>"Side",
61
+ "engageable_cards"=>[]},
62
+ {"discard"=>{"cards"=>[], "_mongo_class"=>"Discard"},
63
+ "deck"=>
64
+ {"cards"=>
65
+ [{"name"=>"Apprentice",
66
+ "runes"=>1,
67
+ "power"=>0,
68
+ "_mongo_class"=>"Card::Hero"},
69
+ {"name"=>"Apprentice",
70
+ "runes"=>1,
71
+ "power"=>0,
72
+ "_mongo_class"=>"Card::Hero"},
73
+ {"name"=>"Apprentice",
74
+ "runes"=>1,
75
+ "power"=>0,
76
+ "_mongo_class"=>"Card::Hero"},
77
+ {"name"=>"Militia",
78
+ "runes"=>0,
79
+ "power"=>1,
80
+ "_mongo_class"=>"Card::Hero"},
81
+ {"name"=>"Militia",
82
+ "runes"=>0,
83
+ "power"=>1,
84
+ "_mongo_class"=>"Card::Hero"}],
85
+ "_mongo_class"=>"PlayerDeck"},
86
+ "hand"=>
87
+ {"cards"=>
88
+ [{"name"=>"Apprentice",
89
+ "runes"=>1,
90
+ "power"=>0,
91
+ "_mongo_class"=>"Card::Hero"},
92
+ {"name"=>"Apprentice",
93
+ "runes"=>1,
94
+ "power"=>0,
95
+ "_mongo_class"=>"Card::Hero"},
96
+ {"name"=>"Apprentice",
97
+ "runes"=>1,
98
+ "power"=>0,
99
+ "_mongo_class"=>"Card::Hero"},
100
+ {"name"=>"Apprentice",
101
+ "runes"=>1,
102
+ "power"=>0,
103
+ "_mongo_class"=>"Card::Hero"},
104
+ {"name"=>"Apprentice",
105
+ "runes"=>1,
106
+ "power"=>0,
107
+ "_mongo_class"=>"Card::Hero"}],
108
+ "_mongo_class"=>"Hand"},
109
+ "played"=>
110
+ {"cards"=>[],
111
+ "pool"=>
112
+ {"runes"=>0,
113
+ "mechana_runes"=>0,
114
+ "construct_runes"=>0,
115
+ "power"=>0,
116
+ "_mongo_class"=>"Pool"},
117
+ "_mongo_class"=>"Played"},
118
+ "constructs"=>{"cards"=>[], "_mongo_class"=>"Constructs"},
119
+ "honor"=>0,
120
+ "_mongo_class"=>"Side",
121
+ "engageable_cards"=>[]}],
122
+ "center"=>
123
+ {"cards"=>
124
+ [{"name"=>"Samael's Trickster",
125
+ "power_cost"=>3,
126
+ "_mongo_class"=>"Card::Monster"},
127
+ {"name"=>"Demon Slayer",
128
+ "runes"=>0,
129
+ "power"=>3,
130
+ "rune_cost"=>4,
131
+ "_mongo_class"=>"Card::Hero"},
132
+ {"name"=>"Demon Slayer",
133
+ "runes"=>0,
134
+ "power"=>3,
135
+ "rune_cost"=>4,
136
+ "_mongo_class"=>"Card::Hero"},
137
+ {"name"=>"Arha Templar",
138
+ "runes"=>0,
139
+ "power"=>0,
140
+ "rune_cost"=>4,
141
+ "_mongo_class"=>"Card::Hero"},
142
+ {"name"=>"Spike Vixen",
143
+ "runes"=>0,
144
+ "power"=>1,
145
+ "rune_cost"=>2,
146
+ "_mongo_class"=>"Card::Hero"},
147
+ {"name"=>"Tormented Soul",
148
+ "power_cost"=>3,
149
+ "_mongo_class"=>"Card::Monster"}],
150
+ "_mongo_class"=>"Center"},
151
+ "void"=>{"cards"=>[], "_mongo_class"=>"Void"},
152
+ "honor"=>60,
153
+ "deck"=>
154
+ {"cards"=>
155
+ [{"name"=>"Seer of the Forked Path",
156
+ "runes"=>0,
157
+ "power"=>0,
158
+ "rune_cost"=>2,
159
+ "_mongo_class"=>"Card::Hero"},
160
+ {"name"=>"Reactor Monk",
161
+ "runes"=>2,
162
+ "power"=>0,
163
+ "rune_cost"=>4,
164
+ "_mongo_class"=>"Card::Hero"},
165
+ {"name"=>"Snapdragon",
166
+ "runes"=>1,
167
+ "power"=>0,
168
+ "rune_cost"=>5,
169
+ "_mongo_class"=>"Card::Construct"},
170
+ {"name"=>"Hedron Cannon",
171
+ "runes"=>0,
172
+ "power"=>0,
173
+ "rune_cost"=>8,
174
+ "_mongo_class"=>"Card::Construct"},
175
+ {"name"=>"Void Initiate",
176
+ "runes"=>1,
177
+ "power"=>0,
178
+ "rune_cost"=>1,
179
+ "_mongo_class"=>"Card::Hero"},
180
+ {"name"=>"Flytrap Witch",
181
+ "runes"=>0,
182
+ "power"=>0,
183
+ "rune_cost"=>5,
184
+ "_mongo_class"=>"Card::Hero"},
185
+ {"name"=>"Mechana Initiate",
186
+ "runes"=>0,
187
+ "power"=>0,
188
+ "rune_cost"=>1,
189
+ "_mongo_class"=>"Card::Hero"},
190
+ {"name"=>"Arha Initiate",
191
+ "runes"=>0,
192
+ "power"=>0,
193
+ "rune_cost"=>1,
194
+ "_mongo_class"=>"Card::Hero"},
195
+ {"name"=>"Yggdrasil Staff",
196
+ "runes"=>0,
197
+ "power"=>1,
198
+ "rune_cost"=>4,
199
+ "_mongo_class"=>"Card::Construct"},
200
+ {"name"=>"Void Initiate",
201
+ "runes"=>1,
202
+ "power"=>0,
203
+ "rune_cost"=>1,
204
+ "_mongo_class"=>"Card::Hero"},
205
+ {"name"=>"Watchmaker Altar",
206
+ "runes"=>0,
207
+ "power"=>0,
208
+ "rune_cost"=>5,
209
+ "_mongo_class"=>"Card::Construct"},
210
+ {"name"=>"Temple Librarian",
211
+ "runes"=>0,
212
+ "power"=>0,
213
+ "rune_cost"=>2,
214
+ "_mongo_class"=>"Card::Hero"},
215
+ {"name"=>"Ascetic of the Lidless Eye",
216
+ "runes"=>0,
217
+ "power"=>0,
218
+ "rune_cost"=>5,
219
+ "_mongo_class"=>"Card::Hero"},
220
+ {"name"=>"Runic Lycanthrope",
221
+ "runes"=>2,
222
+ "power"=>0,
223
+ "rune_cost"=>3,
224
+ "_mongo_class"=>"Card::Hero"},
225
+ {"name"=>"Shadow Star",
226
+ "runes"=>0,
227
+ "power"=>1,
228
+ "rune_cost"=>3,
229
+ "_mongo_class"=>"Card::Construct"},
230
+ {"name"=>"Tablet of Times Dawn",
231
+ "runes"=>0,
232
+ "power"=>0,
233
+ "rune_cost"=>5,
234
+ "_mongo_class"=>"Card::Construct"},
235
+ {"name"=>"Lifeblood Initiate",
236
+ "runes"=>1,
237
+ "power"=>0,
238
+ "rune_cost"=>1,
239
+ "_mongo_class"=>"Card::Hero"},
240
+ {"name"=>"Runic Lycanthrope",
241
+ "runes"=>2,
242
+ "power"=>0,
243
+ "rune_cost"=>3,
244
+ "_mongo_class"=>"Card::Hero"},
245
+ {"name"=>"Void Initiate",
246
+ "runes"=>1,
247
+ "power"=>0,
248
+ "rune_cost"=>1,
249
+ "_mongo_class"=>"Card::Hero"},
250
+ {"name"=>"Avatar ot Fallen",
251
+ "power_cost"=>7,
252
+ "_mongo_class"=>"Card::Monster"},
253
+ {"name"=>"Void Thirster",
254
+ "runes"=>0,
255
+ "power"=>1,
256
+ "rune_cost"=>5,
257
+ "_mongo_class"=>"Card::Construct"},
258
+ {"name"=>"Shade ot Black Watch",
259
+ "runes"=>0,
260
+ "power"=>2,
261
+ "rune_cost"=>3,
262
+ "_mongo_class"=>"Card::Hero"},
263
+ {"name"=>"Wolf Shaman",
264
+ "runes"=>1,
265
+ "power"=>0,
266
+ "rune_cost"=>3,
267
+ "_mongo_class"=>"Card::Hero"},
268
+ {"name"=>"Wolf Shaman",
269
+ "runes"=>1,
270
+ "power"=>0,
271
+ "rune_cost"=>3,
272
+ "_mongo_class"=>"Card::Hero"},
273
+ {"name"=>"Shade ot Black Watch",
274
+ "runes"=>0,
275
+ "power"=>2,
276
+ "rune_cost"=>3,
277
+ "_mongo_class"=>"Card::Hero"},
278
+ {"name"=>"Tormented Soul",
279
+ "power_cost"=>3,
280
+ "_mongo_class"=>"Card::Monster"},
281
+ {"name"=>"Corrosive Widow",
282
+ "power_cost"=>4,
283
+ "_mongo_class"=>"Card::Monster"},
284
+ {"name"=>"Mistake of Creation",
285
+ "power_cost"=>4,
286
+ "_mongo_class"=>"Card::Monster"},
287
+ {"name"=>"Flytrap Witch",
288
+ "runes"=>0,
289
+ "power"=>0,
290
+ "rune_cost"=>5,
291
+ "_mongo_class"=>"Card::Hero"},
292
+ {"name"=>"Arha Initiate",
293
+ "runes"=>0,
294
+ "power"=>0,
295
+ "rune_cost"=>1,
296
+ "_mongo_class"=>"Card::Hero"},
297
+ {"name"=>"Watchmaker Altar",
298
+ "runes"=>0,
299
+ "power"=>0,
300
+ "rune_cost"=>5,
301
+ "_mongo_class"=>"Card::Construct"},
302
+ {"name"=>"Oziah the Peerless",
303
+ "runes"=>0,
304
+ "power"=>0,
305
+ "rune_cost"=>6,
306
+ "_mongo_class"=>"Card::Hero"},
307
+ {"name"=>"The Grand Design",
308
+ "runes"=>0,
309
+ "power"=>0,
310
+ "rune_cost"=>6,
311
+ "_mongo_class"=>"Card::Construct"},
312
+ {"name"=>"Lifeblood Initiate",
313
+ "runes"=>1,
314
+ "power"=>0,
315
+ "rune_cost"=>1,
316
+ "_mongo_class"=>"Card::Hero"},
317
+ {"name"=>"Emeri One with the Void",
318
+ "runes"=>0,
319
+ "power"=>4,
320
+ "rune_cost"=>6,
321
+ "_mongo_class"=>"Card::Hero"},
322
+ {"name"=>"The Grand Design",
323
+ "runes"=>0,
324
+ "power"=>0,
325
+ "rune_cost"=>6,
326
+ "_mongo_class"=>"Card::Construct"},
327
+ {"name"=>"Tormented Soul",
328
+ "power_cost"=>3,
329
+ "_mongo_class"=>"Card::Monster"},
330
+ {"name"=>"Arha Templar",
331
+ "runes"=>0,
332
+ "power"=>0,
333
+ "rune_cost"=>4,
334
+ "_mongo_class"=>"Card::Hero"},
335
+ {"name"=>"Wind Tyrant", "power_cost"=>5, "_mongo_class"=>"Card::Monster"},
336
+ {"name"=>"Burrower Mk II",
337
+ "runes"=>0,
338
+ "power"=>0,
339
+ "rune_cost"=>3,
340
+ "_mongo_class"=>"Card::Construct"},
341
+ {"name"=>"Samael's Trickster",
342
+ "power_cost"=>3,
343
+ "_mongo_class"=>"Card::Monster"},
344
+ {"name"=>"Master Dhartha",
345
+ "runes"=>0,
346
+ "power"=>0,
347
+ "rune_cost"=>7,
348
+ "_mongo_class"=>"Card::Hero"},
349
+ {"name"=>"Mechana Initiate",
350
+ "runes"=>0,
351
+ "power"=>0,
352
+ "rune_cost"=>1,
353
+ "_mongo_class"=>"Card::Hero"},
354
+ {"name"=>"Landtalker",
355
+ "runes"=>3,
356
+ "power"=>0,
357
+ "rune_cost"=>6,
358
+ "_mongo_class"=>"Card::Hero"},
359
+ {"name"=>"Spike Vixen",
360
+ "runes"=>0,
361
+ "power"=>1,
362
+ "rune_cost"=>2,
363
+ "_mongo_class"=>"Card::Hero"},
364
+ {"name"=>"Mistake of Creation",
365
+ "power_cost"=>4,
366
+ "_mongo_class"=>"Card::Monster"},
367
+ {"name"=>"Temple Librarian",
368
+ "runes"=>0,
369
+ "power"=>0,
370
+ "rune_cost"=>2,
371
+ "_mongo_class"=>"Card::Hero"},
372
+ {"name"=>"Reactor Monk",
373
+ "runes"=>2,
374
+ "power"=>0,
375
+ "rune_cost"=>4,
376
+ "_mongo_class"=>"Card::Hero"},
377
+ {"name"=>"Wind Tyrant", "power_cost"=>5, "_mongo_class"=>"Card::Monster"},
378
+ {"name"=>"Ascetic of the Lidless Eye",
379
+ "runes"=>0,
380
+ "power"=>0,
381
+ "rune_cost"=>5,
382
+ "_mongo_class"=>"Card::Hero"},
383
+ {"name"=>"Shadow Star",
384
+ "runes"=>0,
385
+ "power"=>1,
386
+ "rune_cost"=>3,
387
+ "_mongo_class"=>"Card::Construct"},
388
+ {"name"=>"Sea Tyrant", "power_cost"=>5, "_mongo_class"=>"Card::Monster"},
389
+ {"name"=>"Mistake of Creation",
390
+ "power_cost"=>4,
391
+ "_mongo_class"=>"Card::Monster"},
392
+ {"name"=>"Wind Tyrant", "power_cost"=>5, "_mongo_class"=>"Card::Monster"},
393
+ {"name"=>"Arha Initiate",
394
+ "runes"=>0,
395
+ "power"=>0,
396
+ "rune_cost"=>1,
397
+ "_mongo_class"=>"Card::Hero"},
398
+ {"name"=>"Arbiter of the Precipice",
399
+ "runes"=>0,
400
+ "power"=>0,
401
+ "rune_cost"=>4,
402
+ "_mongo_class"=>"Card::Hero"},
403
+ {"name"=>"Cetra Weaver ot Stars",
404
+ "runes"=>0,
405
+ "power"=>0,
406
+ "rune_cost"=>7,
407
+ "_mongo_class"=>"Card::Hero"},
408
+ {"name"=>"Yggdrasil Staff",
409
+ "runes"=>0,
410
+ "power"=>1,
411
+ "rune_cost"=>4,
412
+ "_mongo_class"=>"Card::Construct"},
413
+ {"name"=>"Druids ot Stone Circle",
414
+ "runes"=>0,
415
+ "power"=>0,
416
+ "rune_cost"=>4,
417
+ "_mongo_class"=>"Card::Hero"},
418
+ {"name"=>"Seer of the Forked Path",
419
+ "runes"=>0,
420
+ "power"=>0,
421
+ "rune_cost"=>2,
422
+ "_mongo_class"=>"Card::Hero"},
423
+ {"name"=>"Hedron Link Device",
424
+ "runes"=>0,
425
+ "power"=>0,
426
+ "rune_cost"=>7,
427
+ "_mongo_class"=>"Card::Construct"},
428
+ {"name"=>"Wolf Shaman",
429
+ "runes"=>1,
430
+ "power"=>0,
431
+ "rune_cost"=>3,
432
+ "_mongo_class"=>"Card::Hero"},
433
+ {"name"=>"Corrosive Widow",
434
+ "power_cost"=>4,
435
+ "_mongo_class"=>"Card::Monster"},
436
+ {"name"=>"Void Thirster",
437
+ "runes"=>0,
438
+ "power"=>1,
439
+ "rune_cost"=>5,
440
+ "_mongo_class"=>"Card::Construct"},
441
+ {"name"=>"Burrower Mk II",
442
+ "runes"=>0,
443
+ "power"=>0,
444
+ "rune_cost"=>3,
445
+ "_mongo_class"=>"Card::Construct"},
446
+ {"name"=>"Sea Tyrant", "power_cost"=>5, "_mongo_class"=>"Card::Monster"},
447
+ {"name"=>"Mistake of Creation",
448
+ "power_cost"=>4,
449
+ "_mongo_class"=>"Card::Monster"},
450
+ {"name"=>"Kor the Ferromancer",
451
+ "runes"=>0,
452
+ "power"=>2,
453
+ "rune_cost"=>3,
454
+ "_mongo_class"=>"Card::Hero"},
455
+ {"name"=>"Avatar Golem",
456
+ "runes"=>0,
457
+ "power"=>2,
458
+ "rune_cost"=>4,
459
+ "_mongo_class"=>"Card::Hero"},
460
+ {"name"=>"Twofold Askara",
461
+ "runes"=>0,
462
+ "power"=>0,
463
+ "rune_cost"=>4,
464
+ "_mongo_class"=>"Card::Hero"},
465
+ {"name"=>"Mephit", "power_cost"=>3, "_mongo_class"=>"Card::Monster"},
466
+ {"name"=>"Druids ot Stone Circle",
467
+ "runes"=>0,
468
+ "power"=>0,
469
+ "rune_cost"=>4,
470
+ "_mongo_class"=>"Card::Hero"},
471
+ {"name"=>"Mechana Initiate",
472
+ "runes"=>0,
473
+ "power"=>0,
474
+ "rune_cost"=>1,
475
+ "_mongo_class"=>"Card::Hero"},
476
+ {"name"=>"Arbiter of the Precipice",
477
+ "runes"=>0,
478
+ "power"=>0,
479
+ "rune_cost"=>4,
480
+ "_mongo_class"=>"Card::Hero"},
481
+ {"name"=>"Rocket Courier X-99",
482
+ "runes"=>0,
483
+ "power"=>0,
484
+ "rune_cost"=>4,
485
+ "_mongo_class"=>"Card::Construct"},
486
+ {"name"=>"Temple Librarian",
487
+ "runes"=>0,
488
+ "power"=>0,
489
+ "rune_cost"=>2,
490
+ "_mongo_class"=>"Card::Hero"},
491
+ {"name"=>"Xeron Duke of Lies",
492
+ "power_cost"=>6,
493
+ "_mongo_class"=>"Card::Monster"},
494
+ {"name"=>"Mephit", "power_cost"=>3, "_mongo_class"=>"Card::Monster"},
495
+ {"name"=>"Sea Tyrant", "power_cost"=>5, "_mongo_class"=>"Card::Monster"},
496
+ {"name"=>"Earth Tyrant",
497
+ "power_cost"=>6,
498
+ "_mongo_class"=>"Card::Monster"},
499
+ {"name"=>"Corrosive Widow",
500
+ "power_cost"=>4,
501
+ "_mongo_class"=>"Card::Monster"},
502
+ {"name"=>"The All Seeing Eye",
503
+ "runes"=>0,
504
+ "power"=>0,
505
+ "rune_cost"=>6,
506
+ "_mongo_class"=>"Card::Construct"},
507
+ {"name"=>"Seer of the Forked Path",
508
+ "runes"=>0,
509
+ "power"=>0,
510
+ "rune_cost"=>2,
511
+ "_mongo_class"=>"Card::Hero"},
512
+ {"name"=>"Lifeblood Initiate",
513
+ "runes"=>1,
514
+ "power"=>0,
515
+ "rune_cost"=>1,
516
+ "_mongo_class"=>"Card::Hero"},
517
+ {"name"=>"Samael's Trickster",
518
+ "power_cost"=>3,
519
+ "_mongo_class"=>"Card::Monster"},
520
+ {"name"=>"Samael's Trickster",
521
+ "power_cost"=>3,
522
+ "_mongo_class"=>"Card::Monster"},
523
+ {"name"=>"Rocket Courier X-99",
524
+ "runes"=>0,
525
+ "power"=>0,
526
+ "rune_cost"=>4,
527
+ "_mongo_class"=>"Card::Construct"},
528
+ {"name"=>"Corrosive Widow",
529
+ "power_cost"=>4,
530
+ "_mongo_class"=>"Card::Monster"},
531
+ {"name"=>"Earth Tyrant",
532
+ "power_cost"=>6,
533
+ "_mongo_class"=>"Card::Monster"},
534
+ {"name"=>"Muramasa",
535
+ "runes"=>0,
536
+ "power"=>3,
537
+ "rune_cost"=>7,
538
+ "_mongo_class"=>"Card::Construct"},
539
+ {"name"=>"Avatar Golem",
540
+ "runes"=>0,
541
+ "power"=>2,
542
+ "rune_cost"=>4,
543
+ "_mongo_class"=>"Card::Hero"},
544
+ {"name"=>"Snapdragon",
545
+ "runes"=>1,
546
+ "power"=>0,
547
+ "rune_cost"=>5,
548
+ "_mongo_class"=>"Card::Construct"},
549
+ {"name"=>"Shade ot Black Watch",
550
+ "runes"=>0,
551
+ "power"=>2,
552
+ "rune_cost"=>3,
553
+ "_mongo_class"=>"Card::Hero"},
554
+ {"name"=>"Mephit", "power_cost"=>3, "_mongo_class"=>"Card::Monster"}],
555
+ "_mongo_class"=>"CenterDeck"},
556
+ "_mongo_class"=>"Game"}