gloomhaven 0.1.0 → 1.0.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/config/perks.yml ADDED
@@ -0,0 +1,555 @@
1
+ ---
2
+ add_one_minus_one_dark_card:
3
+ description: Add one -1 Dark card
4
+ add:
5
+ -
6
+ card_name: Attack -1 Dark
7
+ count: 1
8
+ add_one_minus_two_card_and_two_plus_two_cards:
9
+ description: Add one -2 card and two +2 cards
10
+ add:
11
+ -
12
+ card_name: Attack -2
13
+ count: 1
14
+ -
15
+ card_name: Attack +2
16
+ count: 2
17
+ add_one_plus_one_air_card:
18
+ description: Add one +1 Air card
19
+ add:
20
+ -
21
+ card_name: Attack +1 Air
22
+ count: 1
23
+ add_one_plus_one_curse_card:
24
+ description: Add one +0 CURSE card
25
+ add:
26
+ -
27
+ card_name: Attack +0 Curse
28
+ count: 1
29
+ add_one_plus_one_heal_plus_two_card:
30
+ description: Add one +1 Heal +2 card
31
+ add:
32
+ -
33
+ card_name: Attack +1 Heal +2
34
+ count: 1
35
+ add_one_plus_one_immobilize_card:
36
+ description: Add one +1 IMMOBILIZE card
37
+ add:
38
+ -
39
+ card_name: Attack +1 Immobilize
40
+ count: 1
41
+ add_one_plus_one_invisible_card:
42
+ description: Add one +1 INVISIBLE card
43
+ add:
44
+ -
45
+ card_name: Attack +1 Invisible
46
+ count: 1
47
+ add_one_plus_one_poison_card:
48
+ description: Add one +1 POISON card
49
+ add:
50
+ -
51
+ card_name: Attack +1 Poison
52
+ count: 1
53
+ add_one_plus_one_shield_one_self_card:
54
+ description: Add one +1 Shield 1, Self card
55
+ add:
56
+ -
57
+ card_name: Attack +1 Shield 1
58
+ count: 1
59
+ add_one_plus_one_wound_card:
60
+ description: Add one +1 WOUND card
61
+ add:
62
+ -
63
+ card_name: Attack +1 Wound
64
+ count: 1
65
+ add_one_plus_three_card:
66
+ description: Add one +3 card
67
+ add:
68
+ -
69
+ card_name: Attack +3
70
+ count: 1
71
+ add_one_plus_two_card:
72
+ description: Add one +2 card
73
+ add:
74
+ -
75
+ card_name: Attack +2
76
+ count: 1
77
+ add_one_plus_two_fire_card:
78
+ description: Add one +2 Fire Card
79
+ add:
80
+ -
81
+ card_name: Attack +2 Fire
82
+ count: 1
83
+ add_one_plus_two_ice_card:
84
+ description: Add one +2 Ice Card
85
+ add:
86
+ -
87
+ card_name: Attack +2 Ice
88
+ count: 1
89
+ add_one_plus_two_muddle_card:
90
+ description: Add one +2 MUDDLE card
91
+ add:
92
+ -
93
+ card_name: Attack +2 Muddle
94
+ count: 1
95
+ add_one_plus_zero_add_target_card:
96
+ description: Add one +0 ADD TARGET card
97
+ add:
98
+ -
99
+ card_name: Attack +0 Add Target
100
+ count: 1
101
+ add_one_plus_zero_refresh_an_item_card:
102
+ description: Add one +0 Refresh an item card
103
+ add:
104
+ -
105
+ card_name: Attack +0 Refresh item
106
+ count: 1
107
+ add_one_plus_zero_stun_card:
108
+ description: Add one +0 STUN card
109
+ add:
110
+ -
111
+ card_name: Attack +0 Stun
112
+ count: 1
113
+ add_one_rolling_add_target_card:
114
+ description: Add one Rolling ADD TARGET card
115
+ add:
116
+ -
117
+ card_name: Rolling Add Target
118
+ count: 1
119
+ add_one_rolling_dark_and_one_rolling_nature_card:
120
+ description: Add one Rolling Dark and one Rolling Nature card
121
+ add:
122
+ -
123
+ card_name: Rolling Dark
124
+ count: 1
125
+ -
126
+ card_name: Rolling Nature
127
+ count: 1
128
+ add_one_rolling_disarm_card_and_one_rolling_muddle_card:
129
+ description: Add one Rolling DISARM card and one Rolling MUDDLE card
130
+ add:
131
+ -
132
+ card_name: Rolling Disarm
133
+ count: 1
134
+ -
135
+ card_name: Rolling Muddle
136
+ count: 1
137
+ add_one_rolling_fire_and_one_rolling_air_card:
138
+ description: Add one Rolling Fire and one Rolling Air card
139
+ add:
140
+ -
141
+ card_name: Rolling Fire
142
+ count: 1
143
+ -
144
+ card_name: Rolling Air
145
+ count: 1
146
+ add_one_rolling_heal_plus_three_card:
147
+ description: Add one Rolling Heal +3 card
148
+ add:
149
+ -
150
+ card_name: Rolling Heal +3
151
+ count: 1
152
+ add_one_rolling_invisible_card:
153
+ description: Add two Rolling INVISIBLE cards
154
+ add:
155
+ -
156
+ card_name: Rolling Invisible
157
+ count: 1
158
+ add_one_rolling_light_and_one_rolling_dark_card:
159
+ description: Add one Rolling Light and one Rolling Dark card
160
+ add:
161
+ -
162
+ card_name: Rolling Light
163
+ count: 1
164
+ -
165
+ card_name: Rolling Dark
166
+ count: 1
167
+ add_one_rolling_nature_and_one_rolling_air_card:
168
+ description: Add one Rolling Nature and one Rolling Air card
169
+ add:
170
+ -
171
+ card_name: Rolling Nature
172
+ count: 1
173
+ -
174
+ card_name: Rolling Air
175
+ count: 1
176
+ add_one_rolling_plus_one_disarm_card:
177
+ description: Add one Rolling +1 DISARM card
178
+ add:
179
+ -
180
+ card_name: Rolling Attack +1 Disarm
181
+ count: 1
182
+ add_one_rolling_plus_two_card:
183
+ description: Add one Rolling +2 card
184
+ add:
185
+ -
186
+ card_name: Rolling Attack +2
187
+ count: 1
188
+ add_one_rolling_stun_card:
189
+ description: Add one Rolling STUN card
190
+ add:
191
+ -
192
+ card_name: Rolling Stun
193
+ count: 1
194
+ add_three_plus_zero_air_cards:
195
+ description: Add three +0 Air cards
196
+ add:
197
+ -
198
+ card_name: Attack +0 Air
199
+ count: 3
200
+ add_three_plus_zero_fire_cards:
201
+ description: Add three +0 Fire cards
202
+ add:
203
+ -
204
+ card_name: Attack +0 Fire
205
+ count: 3
206
+ add_three_plus_zero_ice_cards:
207
+ description: Add three +0 Ice cards
208
+ add:
209
+ -
210
+ card_name: Attack +0 Ice
211
+ count: 3
212
+ add_three_plus_zero_nature_cards:
213
+ description: Add three +0 Nature cards
214
+ add:
215
+ -
216
+ card_name: Attack +0 Nature
217
+ count: 3
218
+ add_three_rolling_muddle_cards:
219
+ description: Add three Rolling MUDDLE cards
220
+ add:
221
+ -
222
+ card_name: Rolling Muddle
223
+ count: 3
224
+ add_three_rolling_plus_one_cards:
225
+ description: Add three Rolling +1 cards
226
+ add:
227
+ -
228
+ card_name: Rolling Attack +1
229
+ count: 3
230
+ add_three_rolling_poison_cards:
231
+ description: Add three Rolling POISON cards
232
+ add:
233
+ -
234
+ card_name: Rolling Poison
235
+ count: 3
236
+ add_three_rolling_pull_one_cards:
237
+ description: Add three Rolling PULL 1 cards
238
+ add:
239
+ -
240
+ card_name: Rolling Pull 1
241
+ count: 3
242
+ add_three_rolling_push_one_cards:
243
+ description: Add three Rolling PUSH 1 cards
244
+ add:
245
+ -
246
+ card_name: Rolling Push 1
247
+ count: 3
248
+ add_two_plus_one_cards:
249
+ description: Add two +1 cards
250
+ add:
251
+ -
252
+ card_name: Attack +1
253
+ count: 2
254
+ add_two_plus_one_push_one_cards:
255
+ description: Add two +1 PUSH 1 cards
256
+ add:
257
+ -
258
+ card_name: Attack +1 Push 1
259
+ count: 2
260
+ add_two_rolling_air_cards:
261
+ description: Add two Rolling Air Cards
262
+ add:
263
+ -
264
+ card_name: Rolling Air
265
+ count: 2
266
+ add_two_rolling_curse_cards:
267
+ description: Add two Rolling CURSE cards
268
+ add:
269
+ -
270
+ card_name: Rolling Curse
271
+ count: 2
272
+ add_two_rolling_fire_cards:
273
+ description: Add two Rolling Fire cards
274
+ add:
275
+ -
276
+ card_name: Rolling Fire
277
+ count: 2
278
+ add_two_rolling_heal_plus_one_cards:
279
+ description: Add two Rolling Heal +1 cards
280
+ add:
281
+ -
282
+ card_name: Rolling Heal +1
283
+ count: 2
284
+ add_two_rolling_immobilize_cards:
285
+ description: Add two Rolling IMMOBILIZE cards
286
+ add:
287
+ -
288
+ card_name: Rolling Immobilize
289
+ count: 2
290
+ add_two_rolling_light_cards:
291
+ description: Add two Rolling Light cards
292
+ add:
293
+ -
294
+ card_name: Rolling Light
295
+ count: 2
296
+ add_two_rolling_muddle_cards:
297
+ description: Add two Rolling MUDDLE cards
298
+ add:
299
+ -
300
+ card_name: Rolling Muddle
301
+ count: 2
302
+ add_two_rolling_nature_cards:
303
+ description: Add two Rolling Nature Cards
304
+ add:
305
+ -
306
+ card_name: Rolling Nature
307
+ count: 2
308
+ add_two_rolling_pierce_three_cards:
309
+ description: Add two Rolling PIERCE 3 cards
310
+ add:
311
+ -
312
+ card_name: Rolling Pierce 3
313
+ count: 2
314
+ add_two_rolling_plus_one_cards:
315
+ description: Add two Rolling +1 cards
316
+ add:
317
+ -
318
+ card_name: Rolling Attack +1
319
+ count: 2
320
+ add_two_rolling_poison_cards:
321
+ description: Add two Rolling POISON cards
322
+ add:
323
+ -
324
+ card_name: Rolling Poison
325
+ count: 2
326
+ add_two_rolling_push_two_cards:
327
+ description: Add two Rolling PUSH 2 cards
328
+ add:
329
+ -
330
+ card_name: Rolling Push 2
331
+ count: 2
332
+ add_two_rolling_shield_1_self_cards:
333
+ description: Add two Rolling Shield 1, Self cards
334
+ add:
335
+ -
336
+ card_name: Rolling Shield 1, self
337
+ count: 2
338
+ add_two_rolling_wound_cards:
339
+ description: Add two Rolling WOUND cards
340
+ add:
341
+ -
342
+ card_name: Rolling Wound
343
+ count: 2
344
+ ignore_negative_item_effects:
345
+ description: Ignore negative item effects
346
+ ignore_negative_item_effects_and_add_one_plus_one_card:
347
+ description: Ignore negative item effects and add one +1 card
348
+ add:
349
+ -
350
+ card_name: Attack +1
351
+ count: 1
352
+ ignore_negative_item_effects_and_add_two_plus_one_cards:
353
+ description: Ignore negative item effects and add two +1 cards
354
+ add:
355
+ -
356
+ card_name: Attack +1
357
+ count: 2
358
+ ignore_negative_scenario_effects:
359
+ description: Ignore negative scenario effects
360
+ ignore_negative_scenario_effects_and_add_one_plus_one_card:
361
+ description: Ignore scenario item effects and add one +1 card
362
+ add:
363
+ -
364
+ card_name: Attack +1
365
+ count: 1
366
+ ignore_negative_scenario_effects_and_add_two_plus_one_cards:
367
+ description: Ignore scenario item effects and add two +1 cards
368
+ add:
369
+ -
370
+ card_name: Attack +1
371
+ count: 2
372
+ remove_four_plus_zero_cards:
373
+ description: Remove four +1 cards
374
+ remove:
375
+ -
376
+ card_name: Attack +0
377
+ count: 4
378
+ remove_one_minus_two_card:
379
+ description: Remove one -2 card
380
+ remove:
381
+ -
382
+ card_name: Attack -2
383
+ count: 1
384
+ remove_two_minus_one_cards:
385
+ description: Remove two -1 cards
386
+ remove:
387
+ -
388
+ card_name: Attack -1
389
+ count: 2
390
+ replace_one_minus_one_card_with_one_plus_one_card:
391
+ description: Replace one -1 card with one +1 card
392
+ add:
393
+ -
394
+ card_name: Attack +1
395
+ count: 1
396
+ remove:
397
+ -
398
+ card_name: Attack -1
399
+ count: 1
400
+ replace_one_minus_one_card_with_one_plus_zero_stun_card:
401
+ description: Replace one +0 card with one +0 STUN card
402
+ add:
403
+ -
404
+ card_name: Attack +0 Stun
405
+ count: 1
406
+ remove:
407
+ -
408
+ card_name: Attack +0
409
+ count: 1
410
+ replace_one_minus_one_dark_card_with_one_plus_one_dark_card:
411
+ description: Replace one -1 Dark card with one +1 Dark card
412
+ add:
413
+ -
414
+ card_name: Attack +1 Dark
415
+ count: 1
416
+ remove:
417
+ -
418
+ card_name: Attack -1 Dark
419
+ count: 1
420
+ replace_one_minus_two_card_with_one_plus_zero_card:
421
+ description: Replace one -2 card with one +0 card
422
+ add:
423
+ -
424
+ card_name: Attack +0
425
+ count: 1
426
+ remove:
427
+ -
428
+ card_name: Attack -2
429
+ count: 1
430
+ replace_one_plus_zero_card_with_one_plus_one_disarm_card:
431
+ description: Replace one +0 card with one +1 DISARM card
432
+ add:
433
+ -
434
+ card_name: Attack +1 Disarm
435
+ count: 1
436
+ remove:
437
+ -
438
+ card_name: Attack +0
439
+ count: 1
440
+ replace_one_plus_zero_card_with_one_plus_one_immobilize_card:
441
+ description: Replace one +0 card with one +1 IMMOBILIZE card
442
+ add:
443
+ -
444
+ card_name: Attack +1 Immobilize
445
+ count: 1
446
+ remove:
447
+ -
448
+ card_name: Attack +0
449
+ count: 1
450
+ replace_one_plus_zero_card_with_one_plus_three_muddle_card:
451
+ description: Replace one +0 card with one +3 MUDDLE card
452
+ add:
453
+ -
454
+ card_name: Attack +3 Muddle
455
+ count: 1
456
+ remove:
457
+ -
458
+ card_name: Attack +0
459
+ count: 1
460
+ replace_one_plus_zero_card_with_one_plus_two_card:
461
+ description: Replace one +0 card with one +2 card
462
+ add:
463
+ -
464
+ card_name: Attack +2
465
+ count: 1
466
+ remove:
467
+ -
468
+ card_name: Attack +0
469
+ count: 1
470
+ replace_one_plus_zero_card_with_one_plus_two_poison_card:
471
+ description: Replace one +0 card with one +2 POISON card
472
+ add:
473
+ -
474
+ card_name: Attack +2 Poison
475
+ count: 1
476
+ remove:
477
+ -
478
+ card_name: Attack +0
479
+ count: 1
480
+ replace_one_plus_zero_card_with_one_plus_two_wound_card:
481
+ description: Replace one +0 card with one +2 WOUND card
482
+ add:
483
+ -
484
+ card_name: Attack +2 Wound
485
+ count: 1
486
+ remove:
487
+ -
488
+ card_name: Attack +0
489
+ count: 1
490
+ replace_one_plus_zero_card_with_one_rolling_plus_two_card:
491
+ description: Replace one +0 card with one Rolling +2 card
492
+ add:
493
+ -
494
+ card_name: Rolling Attack +2
495
+ count: 1
496
+ remove:
497
+ -
498
+ card_name: Attack +0
499
+ count: 1
500
+ replace_two_plus_one_cards_with_one_plus_four_card:
501
+ description: Replace two +1 cards with one +4 card
502
+ add:
503
+ -
504
+ card_name: Attack +4
505
+ count: 1
506
+ remove:
507
+ -
508
+ card_name: Attack +1
509
+ count: 2
510
+ replace_two_plus_one_cards_with_two_plus_two_cards:
511
+ description: Replace two +1 cards with two +2 cards
512
+ add:
513
+ -
514
+ card_name: Attack +2
515
+ count: 2
516
+ remove:
517
+ -
518
+ card_name: Attack +1
519
+ count: 2
520
+ replace_two_plus_zero_cards_with_one_plus_zero_fire_and_one_plus_zero_nature_card:
521
+ description: Replace two +0 cards with one +0 Fire and one +0 Nature card
522
+ add:
523
+ -
524
+ card_name: Attack +0 Fire
525
+ count: 1
526
+ -
527
+ card_name: Attack +0 Nature
528
+ count: 1
529
+ remove:
530
+ -
531
+ card_name: Attack +0
532
+ count: 2
533
+ replace_two_plus_zero_cards_with_one_plus_zero_ice_and_one_plus_zero_air_card:
534
+ description: Replace two +0 cards with one +0 Ice and one +0 Air card
535
+ add:
536
+ -
537
+ card_name: Attack +0 Ice
538
+ count: 1
539
+ -
540
+ card_name: Attack +0 Air
541
+ count: 1
542
+ remove:
543
+ -
544
+ card_name: Attack +0
545
+ count: 2
546
+ replace_two_plus_zero_cards_with_two_plus_one_cards:
547
+ description: Replace two +0 cards with two +1 cards
548
+ add:
549
+ -
550
+ card_name: Attack +1
551
+ count: 2
552
+ remove:
553
+ -
554
+ card_name: Attack +0
555
+ count: 2
@@ -1,25 +1,20 @@
1
1
  module Gloomhaven
2
2
  class Card
3
- attr_reader :attack
4
- attr_reader :crit
5
- attr_reader :name
6
- attr_reader :miss
7
- attr_reader :shuffle
8
-
9
- # returns a card object from the card name
10
- def self.find(name)
11
- Card.new(find_id_by_name(name))
12
- end
13
3
 
14
- def initialize(number)
15
- validate_card_number!(number)
4
+ attr_reader :attack, :crit, :miss, :name, :shuffle
5
+
6
+ def initialize(name)
7
+ raise ArgumentError.new('Name must be a string') unless name.is_a?(String)
16
8
 
17
- data = CARDS[number]
18
- @name = data['name']
19
- @attack = data['attack']
20
- @crit = data['crit'] == true
21
- @miss = data['miss'] == true
22
- @shuffle = data['shuffle'] == true
9
+ card_data = CARDS.detect { |card| card['name'].downcase == name.downcase }
10
+ validate!(card_data)
11
+
12
+ @name = card_data['name']
13
+ @attack = card_data['attack']
14
+ @crit = card_data['crit'] == true
15
+ @miss = card_data['miss'] == true
16
+ @rolling = card_data['rolling'] == true
17
+ @shuffle = card_data['shuffle'] == true
23
18
  end
24
19
 
25
20
  def bless?
@@ -30,16 +25,14 @@ module Gloomhaven
30
25
  name.downcase == 'curse'
31
26
  end
32
27
 
33
- private
34
-
35
- # returns yaml-id of the card by name
36
- def self.find_id_by_name(name)
37
- CARDS.select { |id, attributes| attributes['name'].downcase == name.downcase }.keys.first
28
+ def rolling?
29
+ @rolling
38
30
  end
39
31
 
40
- def validate_card_number!(number)
41
- raise ArgumentError.new('Number must be an integer') unless number.is_a?(Integer)
42
- raise ArgumentError.new('Number is not supported') unless Gloomhaven::CARDS.keys.include?(number)
32
+ private
33
+
34
+ def validate!(data)
35
+ raise CardNotFoundError.new unless data
43
36
  end
44
37
  end
45
38
  end
@@ -17,7 +17,7 @@ module Gloomhaven
17
17
  # Ex:
18
18
  #
19
19
  # deck = Deck.new
20
- # card = Card.find('Attack +3')
20
+ # card = Card.new('Attack +3')
21
21
  # deck.add!(card)
22
22
  def add!(card)
23
23
  raise TypeError.new('Card must be a Gloomhaven::Card') unless card.is_a?(Gloomhaven::Card)
@@ -29,14 +29,14 @@ module Gloomhaven
29
29
  ##
30
30
  # Adds a bless card to the current deck, then soft shuffles
31
31
  def bless!
32
- @cards << Card.find('Bless')
32
+ @cards << Card.new('Bless')
33
33
  shuffle!(soft_shuffle: true)
34
34
  end
35
35
 
36
36
  ##
37
37
  # Adds a curse card to the current deck, then soft shuffles
38
38
  def curse!
39
- @cards << Card.find('Curse')
39
+ @cards << Card.new('Curse')
40
40
  shuffle!(soft_shuffle: true)
41
41
  end
42
42
 
@@ -57,7 +57,7 @@ module Gloomhaven
57
57
  # Ex:
58
58
  #
59
59
  # deck = Deck.new
60
- # card = Card.find('Attack -1')
60
+ # card = Card.new('Attack -1')
61
61
  # deck.remove!(card)
62
62
  def remove!(card)
63
63
  raise TypeError.new('Card must be a Gloomhaven::Card') unless card.is_a?(Gloomhaven::Card)
@@ -76,7 +76,7 @@ module Gloomhaven
76
76
  # Can override with `options = { soft_shuffle: true }` to
77
77
  # only shuffle cards not yet drawn (useful for blesses/curses)
78
78
  def shuffle!(options = {})
79
- options[:soft_shuffle] ||= false
79
+ options[:soft_shuffle] ||= false
80
80
  return @cards.shuffle! if options[:soft_shuffle]
81
81
 
82
82
  @cards = (@cards + @drawn_cards).shuffle
@@ -88,8 +88,8 @@ module Gloomhaven
88
88
 
89
89
  def build_base_deck!
90
90
  CARDS.each do |card|
91
- id, attributes = card
92
- attributes['starting_count'].times { cards << Card.new(id) }
91
+ number = card['starting_count'] || 0
92
+ number.times { cards << Card.new(card['name']) }
93
93
  end
94
94
  end
95
95
  end
@@ -0,0 +1,32 @@
1
+ module Gloomhaven
2
+ class Perk
3
+ attr_reader :adds, :description, :key, :removes
4
+
5
+ def initialize(key)
6
+ validate!(key)
7
+
8
+ perk_hash = PERKS[key]
9
+ @key = key
10
+ @description = perk_hash['description']
11
+ @adds = perk_hash['add'] || []
12
+ @removes = perk_hash['remove'] || []
13
+ end
14
+
15
+ ##
16
+ # returns a hash of card objects
17
+ # Ex: Perk.new.cards
18
+ # => { add: [Card, Card], remove: [Card, Card, Card] }
19
+ def cards
20
+ result = { 'add' => [], 'remove' => [] }
21
+ adds.each { |effect| result['add'] = 1.upto(effect['count']).map { Card.new(effect['card_name']) } }
22
+ removes.each { |effect| result['remove'] = 1.upto(effect['count']).map { Card.new(effect['card_name']) } }
23
+ result
24
+ end
25
+
26
+ private
27
+
28
+ def validate!(key)
29
+ raise TypeError.new("Perk #{key} is not supported") unless PERKS[key]
30
+ end
31
+ end
32
+ end