manasimu 0.0.13 → 0.0.16

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 15aafb1d5f12798204ce6bc38d36acbc1ab98937f7ff4f25ee43eb46bfde71e9
4
- data.tar.gz: cd22e5a0e1773ae2a1d2ebdfde87665a187c57fde927cf22ef950e4888a9568b
3
+ metadata.gz: 3343e9db3fa8daa5303ccd50b555a5d5d25bd961d20c5392a8d526e8a78f425e
4
+ data.tar.gz: ddc59e45c459dfcd2cebb65d8104d0d25ac91a04bcb6ab387c0cd8bf285da24e
5
5
  SHA512:
6
- metadata.gz: c74b8a9b11f5fb2194b2338923e5b2a765f1f9e60110397ecbdd82d2f34aba61f5b8b1024ba94bdd4b3ffef66a961d179dcc458e1736bec8865aafd3cb320c86
7
- data.tar.gz: 8015c756b8f118a6df781c50239f5364efd63f026611a84621bf50f83d1fe248a0c6c2f4bce56a0f1fea58909c8f97afec3164ee75e3c99c4d1379cee1171f8f
6
+ metadata.gz: 67d7fb4abda302154d59c4de1e756c32c6b762a0d80c5fd7ce4c16fd6e3190509684796f8ee5a0c466066b1e32eba3f443366624909a2e0a2994ce4ceec9d65a
7
+ data.tar.gz: 2a8c4ec688061b5d55ae4c2d8c2832089975c55b9993b08edd1d795292e9312fba52a54232cf861291d55ccbb06c5da075217a9462d6feafeda62b998adcd959
Binary file
@@ -0,0 +1,3 @@
1
+ class BasicLandCard < Card
2
+
3
+ end
@@ -15,11 +15,12 @@ class PathwayCard < Card
15
15
  end
16
16
  end
17
17
 
18
- def color_identity
18
+ def mana_source
19
19
  if @side
20
20
  [@symbol]
21
21
  else
22
22
  @card_type.color_identity
23
23
  end
24
24
  end
25
+
25
26
  end
@@ -1,6 +1,7 @@
1
1
  class SlowLandCard < Card
2
2
 
3
- def resolve(side, hands, plays)
3
+ def resolve(side, hands, plays, deck)
4
+ super(side, hands, plays, deck)
4
5
  num = 0
5
6
  for card in plays do
6
7
  next if card == self
@@ -15,7 +16,8 @@ class SlowLandCard < Card
15
16
  end
16
17
  end
17
18
 
18
- def step(turn)
19
+ def step_in_plays(turn)
20
+ super(turn)
19
21
  @tapped = false
20
22
  end
21
23
 
@@ -24,6 +26,7 @@ class SlowLandCard < Card
24
26
  end
25
27
 
26
28
  def reset
29
+ super
27
30
  @tapped = false
28
31
  end
29
32
  end
@@ -0,0 +1,55 @@
1
+ class SncFetchLandCard < TapLandCard
2
+
3
+ def resolve(side, hands, plays, deck)
4
+ super(side, hands, plays, deck)
5
+ return @fetch_source if @fetch_source
6
+ @tapped = true
7
+ if deck
8
+ @fetches = deck
9
+ .select { |card| card.instance_of? BasicLandCard }
10
+ .select { |card| @mana_source.include? card.mana_source[0] }
11
+ .uniq { |card| card.card_type }
12
+ @deck = deck
13
+ @fetch_source = @fetches.map { |card| card.mana_source }.flatten.uniq
14
+ else
15
+ @fetches = []
16
+ @fetch_source = []
17
+ end
18
+ end
19
+
20
+ def first_produce_symbol=(color)
21
+ super(color)
22
+ basic_land = @fetches.select {|card| @mana_source.include? color}.first
23
+ if @deck and basic_land
24
+ @deck.delete basic_land
25
+ @deck.shuffle!
26
+ @fetch_source = [color]
27
+ @fetches = [basic_land]
28
+ else
29
+ []
30
+ end
31
+ @fetched = true
32
+ end
33
+
34
+ def mana_source
35
+ raise Exception.new('you should resolve first') if not @fetch_source
36
+ @fetch_source
37
+ end
38
+
39
+ def configure
40
+ mana_types = ManaType.search_text_by_land_type(card_type.text)
41
+ @mana_source = mana_types.map {|mana_type| mana_type.color}.flatten.uniq
42
+ @fetched = false
43
+ self
44
+ end
45
+
46
+ def reset
47
+ super
48
+ @fetched = false
49
+ @fetch_source = nil
50
+ end
51
+
52
+ def mana_produced?
53
+ @fetched
54
+ end
55
+ end
@@ -4,15 +4,18 @@ class TapLandCard < Card
4
4
  @tapped
5
5
  end
6
6
 
7
- def resolve(side, hands, plays)
7
+ def resolve(side, hands, plays, deck)
8
+ super(side, hands, plays, deck)
8
9
  @tapped = true
9
10
  end
10
11
 
11
- def step(turn)
12
+ def step_in_plays(turn)
13
+ super(turn)
12
14
  @tapped = false
13
15
  end
14
16
 
15
17
  def reset
18
+ super
16
19
  @tapped = false
17
20
  end
18
21
  end
data/lib/manasimu/card.rb CHANGED
@@ -6,11 +6,18 @@ class Card
6
6
  @playable = false
7
7
  end
8
8
 
9
- def step(turn)
10
- @card_type.step(turn - 1, self)
9
+ def configure
10
+ end
11
+
12
+ def step_in_hands(turn)
13
+ @card_type.step_in_hands(turn, self)
11
14
  @can_play = false
12
15
  end
13
16
 
17
+ def step_in_plays(turn)
18
+ @card_type.step_in_plays(turn, self)
19
+ end
20
+
14
21
  def drawed(turn)
15
22
  @drawed = turn
16
23
  @card_type.drawed(turn)
@@ -19,10 +26,12 @@ class Card
19
26
  def played(turn, side = "a")
20
27
  @played = turn
21
28
  @side = side
22
- @card_type.played(turn)
29
+ if not is_land? or not tapped?
30
+ @card_type.played(turn)
31
+ end
23
32
  end
24
33
 
25
- def resolve(side = "a", hands, plays)
34
+ def resolve(side = "a", hands, plays, deck)
26
35
  end
27
36
 
28
37
  def played?
@@ -33,6 +42,14 @@ class Card
33
42
  false
34
43
  end
35
44
 
45
+ def mana_source
46
+ @card_type.mana_source
47
+ end
48
+
49
+ def mana_source_size
50
+ @card_type.mana_source_size
51
+ end
52
+
36
53
  def mana_source?
37
54
  @card_type.mana_source?
38
55
  end
@@ -51,8 +68,8 @@ class Card
51
68
  @card_type.types
52
69
  end
53
70
 
54
- def mana
55
- @card_type.mana
71
+ def type
72
+ @card_type.type
56
73
  end
57
74
 
58
75
  def color_identity
@@ -77,7 +94,9 @@ class Card
77
94
 
78
95
  def reset
79
96
  @side = nil
80
- @tapped = nil
97
+ @played = nil
98
+ @drawed = nil
99
+ @can_play = false
81
100
  end
82
101
 
83
102
  def is_land?
@@ -99,13 +118,17 @@ class Card
99
118
  def first_produce_symbol=(symbol)
100
119
  end
101
120
 
121
+ def set_code
122
+ @card_type.set_code
123
+ end
124
+
102
125
  def to_s
103
126
  @card_type.to_s
104
127
  end
105
128
  end
106
129
 
107
130
  class CardType
108
- attr_accessor :contents, :played, :drawed, :name, :can_plays
131
+ attr_accessor :contents, :played, :drawed, :name, :can_plays, :mana_sources
109
132
 
110
133
  def self.create(card_type, name)
111
134
  ret = card_type.dup
@@ -113,6 +136,7 @@ class CardType
113
136
  ret.played = {}
114
137
  ret.drawed = {}
115
138
  ret.can_plays = {}
139
+ ret.mana_sources = {}
116
140
  ret.name = name
117
141
  ret
118
142
  end
@@ -122,6 +146,7 @@ class CardType
122
146
  @played = {}
123
147
  @drawed = {}
124
148
  @can_plays = {}
149
+ @mana_sources = {}
125
150
  @contents = contents.map {|c| Content.new(c)}
126
151
  end
127
152
 
@@ -129,13 +154,24 @@ class CardType
129
154
  @name ||= @contents[0].name
130
155
  end
131
156
 
132
- def step(turn, card)
133
- if turn >= 0 and card.can_play?
157
+ def step_in_hands(turn, card)
158
+ if card.can_play?
134
159
  @can_plays[turn] ||= 0
135
160
  @can_plays[turn] += 1
136
161
  end
137
162
  end
138
163
 
164
+ def step_in_plays(turn, card)
165
+ if card.mana_source? and not card.tapped?
166
+ @mana_sources[turn] ||= {}
167
+ size = card.mana_source.length
168
+ card.mana_source.each do |c|
169
+ @mana_sources[turn][c] ||= 0
170
+ @mana_sources[turn][c] += 1.0 / size
171
+ end
172
+ end
173
+ end
174
+
139
175
  def played(turn)
140
176
  @played[turn] ||= 0
141
177
  @played[turn] += 1
@@ -146,47 +182,63 @@ class CardType
146
182
  @drawed[turn] += 1
147
183
  end
148
184
 
185
+ def mana_source
186
+ @mana_source ||= @contents.map { |c|
187
+ c.color_identity ? c.color_identity.split(',') : []
188
+ }.flatten.uniq
189
+ end
190
+
191
+ def mana_source_size
192
+ (a = mana_source) ? a.size : 0
193
+ end
194
+
149
195
  def mana_source?
150
- @mana_source ||= @contents.any? {|content| content.mana_source?}
196
+ @is_mana_source ||= @contents.any? {|content| content.mana_source?}
151
197
  end
152
198
 
153
- def types
154
- @types ||= @contents.map {|c| c.types}
199
+ def mana_cost
200
+ return @mana_cost if @mana_cost
201
+ spell = @contents.select {|c| c.types != "Land"}.first
202
+ if spell
203
+ @mana_cost = spell.mana_cost
204
+ else
205
+ @mana_cost = '0'
206
+ end
155
207
  end
156
208
 
157
- def mana
158
- @mana ||= @contents.map {|content| content.color_identity }.flatten
209
+ def converted_mana_cost
210
+ @converted_mana_cost ||= @contents.map {|c| c.converted_mana_cost}.min
211
+ end
212
+
213
+ def text
214
+ @text ||= @contents.map {|c| c.text}.flatten.join('')
215
+ end
216
+
217
+ def type
218
+ @type ||= @contents.map {|c| c.type}.flatten.uniq
219
+ end
220
+
221
+ def types
222
+ @types ||= @contents.map {|c| c.types}
159
223
  end
160
224
 
161
225
  def color_identity
162
226
  return @memo_colors if @memo_colors
163
227
  @memo_colors ||= []
164
228
  @contents.each do |c|
165
- c.color_identity.split(",").each do |color|
166
- @memo_colors << color if not @memo_colors.include? color
229
+ if c.color_identity
230
+ c.color_identity.split(",").each do |color|
231
+ @memo_colors << color if not @memo_colors.include? color
232
+ end
167
233
  end
168
234
  end
169
235
  @memo_colors
170
236
  end
171
237
 
172
- def converted_mana_cost
173
- @converted_mana_cost ||= @contents.map {|c| c.converted_mana_cost}.min
174
- end
175
-
176
238
  def color_identity_size
177
239
  color_identity.length
178
240
  end
179
241
 
180
- def mana_cost
181
- return @mana_cost if @mana_cost
182
- spell = @contents.select {|c| c.types != "Land"}.first
183
- if spell
184
- @mana_cost = spell.mana_cost
185
- else
186
- @mana_cost = '0'
187
- end
188
- end
189
-
190
242
  def symbols
191
243
  return @symbols if @symbols
192
244
  @symbols = []
@@ -215,7 +267,12 @@ class CardType
215
267
  converted_mana_cost
216
268
  end
217
269
 
270
+ def set_code
271
+ @contents[0].set_code
272
+ end
273
+
218
274
  def is_land?(side = nil)
275
+ return @is_land if @is_land
219
276
  arr = if side == 'a'
220
277
  [0]
221
278
  elsif side == 'b'
@@ -223,9 +280,10 @@ class CardType
223
280
  else
224
281
  [0,1]
225
282
  end
226
- arr.select do |i|
283
+ @is_land = arr.select do |i|
227
284
  @contents[i] and @contents[i].types == "Land"
228
285
  end.length > 0
286
+ return @is_land
229
287
  end
230
288
 
231
289
  def playable?(lands, capas)
@@ -284,7 +342,7 @@ class CardType
284
342
  # lands and mana_cost connect to each symbols
285
343
  lands.each_with_index do |land, i|
286
344
  next if capas[i].to_i == 0
287
- land_colors = land.color_identity
345
+ land_colors = land.mana_source
288
346
  symbols.each_with_index do |symbol, j|
289
347
  if symbol == "1" or land_colors.include? symbol
290
348
  result << [i + 1, x + 1 + j]
@@ -305,18 +363,23 @@ class CardType
305
363
 
306
364
  def count(turn = nil)
307
365
  turn ||= converted_mana_cost
308
- played = @played [turn] || 0
309
- drawed = 0
366
+ played_count = @played[turn] || 0
367
+ drawed_count = 0
310
368
  (turn+1).times do |i|
311
- drawed += @drawed[i] || 0
369
+ drawed_count += @drawed[i] || 0
312
370
  end
313
- can_played = @can_plays[turn] || 0
314
- [played, drawed, can_played]
371
+ can_played_count = @can_plays[turn] || 0
372
+ mana_sources_count = @mana_sources[turn] || {}
373
+ [played_count, drawed_count, can_played_count, mana_sources_count]
315
374
  end
316
375
 
317
376
  def to_s
318
377
  @contents.map {|c| c.to_s}.join(",")
319
378
  end
379
+
380
+ def to_factory
381
+ @contents.map {|c| c.to_factory}
382
+ end
320
383
  end
321
384
 
322
385
  class CardTypeAggregate
@@ -344,7 +407,7 @@ class CardTypeAggregate
344
407
  end
345
408
 
346
409
  class Content
347
- attr_accessor :name, :number, :side, :set_code, :mana_cost, :types, :color_identity, :converted_mana_cost, :text
410
+ attr_accessor :name, :number, :side, :set_code, :mana_cost, :type, :types, :color_identity, :converted_mana_cost, :text
348
411
 
349
412
  def initialize(hash)
350
413
  @name = hash[:name]
@@ -353,6 +416,7 @@ class Content
353
416
  @set_code = hash[:set_code]
354
417
  @mana_cost = hash[:mana_cost]
355
418
  @types = hash[:types]
419
+ @type = hash[:type]
356
420
  @text = hash[:text]
357
421
  @color_identity = hash[:color_identity]
358
422
  @converted_mana_cost = hash[:converted_mana_cost].to_i
@@ -366,6 +430,23 @@ class Content
366
430
  "[#{@name}] [#{@types}] [#{@color_identity}] [#{@mana_cost}]"
367
431
  end
368
432
 
433
+ def to_factory
434
+ <<EOF
435
+ factory '#{@name.underscore}_content', class: Content do
436
+ name {'#{@name}'}
437
+ number {'#{@number}'}
438
+ side {'#{@side}'}
439
+ set_code { '#{@set_code}'}
440
+ mana_cost { '#{@mana_cost}'}
441
+ type { '#{@type}'}
442
+ types { '#{@types}'}
443
+ text { '#{@text}'}
444
+ color_identity { '#{@color_identity}'}
445
+ converted_mana_cost {#{@converted_mana_cost}}
446
+ end
447
+ EOF
448
+ end
449
+
369
450
  end
370
451
 
371
452
  class FordFulkersonSingleton
data/lib/manasimu/data.rb CHANGED
@@ -70,14 +70,22 @@ class Deck
70
70
  card_type = @@card_types.find(deck_item[:set], deck_item[:setnum])
71
71
  clone = CardType.create(card_type, deck_item[:name])
72
72
  card_types << clone
73
- if clone.name =~ /.*Pathway$/ and clone.mana_source?
74
- card = PathwayCard.new(clone)
75
- elsif clone.is_land? and
76
- clone.contents[0].text =~ /enters the battlefield tapped\./
77
- card = TapLandCard.new(clone)
78
- elsif clone.is_land? and
79
- clone.contents[0].text =~ /enters the battlefield tapped unless you control two or more other lands./
80
- card = SlowLandCard.new(clone)
73
+ if clone.is_land?
74
+ if clone.name =~ /.*Pathway$/
75
+ card = PathwayCard.new(clone)
76
+ elsif clone.contents[0].text =~ /enters the battlefield tapped\./
77
+ card = TapLandCard.new(clone)
78
+ elsif clone.contents[0].text =~ /enters the battlefield tapped unless you control two or more other lands./
79
+ card = SlowLandCard.new(clone)
80
+ elsif clone.set_code == 'SNC' and
81
+ clone.contents[0].text =~ /enters the battlefield, sacrifice it/
82
+ card = SncFetchLandCard.new(clone)
83
+ card.configure
84
+ elsif clone.type[0] =~ /^Basic Land — .*$/
85
+ card = BasicLandCard.new(clone)
86
+ else
87
+ card = Card.new(clone)
88
+ end
81
89
  else
82
90
  card = Card.new(clone)
83
91
  end
data/lib/manasimu/game.rb CHANGED
@@ -1,48 +1,56 @@
1
1
  class Game
2
2
  attr_accessor :hands, :plays, :deck
3
3
 
4
- def initialize(deck)
5
- @deck = deck.shuffle(random: Random.new)
4
+ def initialize(deck, shuffle = true, debugg = false)
5
+ if shuffle
6
+ @deck = deck.shuffle(random: Random.new)
7
+ else
8
+ @deck = deck
9
+ end
6
10
  @deck.each { |card| card.reset }
7
11
  @hands = []
8
12
  @plays = []
9
13
  @planner = Planner.new
14
+ @debugg = debugg
10
15
  7.times { draw(0) }
11
16
  end
12
17
 
13
18
  def step(turn)
14
- # puts "turn #{turn}"
15
- # puts "played"
16
- # @plays.each do |card| puts " #{card}" end
17
- # puts "hands"
18
- # @hands.each do |card| puts " #{card}" end
19
+ if @debugg
20
+ puts "turn #{turn}"
21
+ puts "played"
22
+ @plays.each do |card| puts " #{card}" end
23
+ puts "hands"
24
+ @hands.each do |card| puts " #{card}" end
25
+ end
19
26
 
20
- upkeep(turn)
21
27
  draw(turn)
28
+ play_cards = plan;
29
+ @hands.each { |card| card.step_in_hands(turn) }
22
30
  plan.each do |card|
23
31
  play(card, turn)
24
32
  end
25
- end
26
-
27
- def upkeep(turn)
28
- @hands.each { |card| card.step(turn) }
29
- @plays.each { |card| card.step(turn) }
33
+ @plays.each { |card| card.step_in_plays(turn) }
30
34
  end
31
35
 
32
36
  def draw(turn)
33
37
  card = @deck.pop
34
- # puts "draw #{card}"
38
+ if @debugg
39
+ puts "draw #{card}"
40
+ end
35
41
  card.drawed(turn)
36
42
  @hands << card
37
43
  end
38
44
 
39
45
  def plan
40
- @planner.plan(@hands, @plays)
46
+ @planner.plan(@hands, @plays, @deck)
41
47
  end
42
48
 
43
49
  def play(card, turn)
44
- # puts "play #{card}"
45
- card.resolve(nil, @hands, @plays)
50
+ if @debugg
51
+ puts "play #{card}"
52
+ end
53
+ card.resolve(nil, @hands, @plays, @deck)
46
54
  card.played(turn, nil)
47
55
  @plays << card
48
56
  @hands.delete card
@@ -1,7 +1,55 @@
1
1
  class ManaType
2
- class Red end;
3
- class Blue end;
4
- class Green end;
5
- class White end;
6
- class Black end;
2
+ attr_accessor :color, :land_type
3
+
4
+ def initialize(color, land_type)
5
+ @land_type = land_type
6
+ @color = color
7
+ end
8
+
9
+ def self.all
10
+ r ||= Red.new
11
+ u ||= Blue.new
12
+ g ||= Green.new
13
+ w ||= White.new
14
+ b ||= Black.new
15
+ @@all ||= [r, u, g, w, b]
16
+ end
17
+
18
+ def self.search_text_by_land_type(text)
19
+ self.all.select do |mana_type|
20
+ text.include? mana_type.land_type
21
+ end
22
+ end
23
+
24
+ def self.search_text_by_color(text)
25
+ self.all.select do |mana_type|
26
+ text.include? mana_type.color
27
+ end
28
+ end
29
+
30
+ class Red < ManaType
31
+ def initialize
32
+ super("R", "Mountain")
33
+ end
34
+ end
35
+ class Blue < ManaType
36
+ def initialize
37
+ super("U", "Island")
38
+ end
39
+ end
40
+ class Green < ManaType
41
+ def initialize
42
+ super("G", "Forest")
43
+ end
44
+ end
45
+ class White < ManaType
46
+ def initialize
47
+ super("W", "Plains")
48
+ end
49
+ end
50
+ class Black < ManaType
51
+ def initialize
52
+ super("B", "Swamp")
53
+ end
54
+ end
7
55
  end
@@ -1,6 +1,6 @@
1
1
  class Planner
2
2
 
3
- def plan(hands, fields)
3
+ def plan(hands, fields, deck)
4
4
  lands_in_hand = lands(hands)
5
5
 
6
6
  max_price = 0
@@ -14,11 +14,12 @@ class Planner
14
14
  # dup
15
15
  current_hands = hands.dup
16
16
  current_fields = fields.dup
17
+ current_deck = deck.dup
17
18
 
18
19
  # play the land
19
20
  current_hands.delete play_land
20
21
  current_fields << play_land
21
- play_land.resolve(nil, current_hands, current_fields)
22
+ play_land.resolve(nil, current_hands, current_fields, current_deck)
22
23
 
23
24
  # search_opt_spells
24
25
  price, spells, symbols, lands =
@@ -68,7 +69,7 @@ class Planner
68
69
  end
69
70
 
70
71
  lands.sort! do |a, b|
71
- b.color_identity_size <=> a.color_identity_size
72
+ b.mana_source_size <=> a.mana_source_size
72
73
  end
73
74
 
74
75
  price = 0
@@ -6,7 +6,7 @@ class Simulator
6
6
 
7
7
  def run
8
8
  @config.simulations.times do
9
- game = Game.new(@config.deck)
9
+ game = Game.new(@config.deck, true, @config.debugg)
10
10
  @config.turns.times do |i|
11
11
  turn = i + 1
12
12
  game.step turn
@@ -16,5 +16,8 @@ class Simulator
16
16
  end
17
17
 
18
18
  class SimulatorConfig
19
- attr_accessor :simulations, :turns, :deck
19
+ attr_accessor :simulations, :turns, :deck, :debugg
20
+ def initialize
21
+ @debugg = false
22
+ end
20
23
  end
data/lib/manasimu.rb CHANGED
@@ -1,10 +1,13 @@
1
1
  require 'bundler'
2
2
  Bundler.require
3
3
 
4
+ require_relative './manasimu/mana_type.rb'
4
5
  require_relative './manasimu/card.rb'
6
+ require_relative './manasimu/card/basicland.rb'
5
7
  require_relative './manasimu/card/pathway.rb'
6
8
  require_relative './manasimu/card/tapland.rb'
7
9
  require_relative './manasimu/card/slowland.rb'
10
+ require_relative './manasimu/card/snc_fetchland.rb'
8
11
  require_relative './manasimu/planner.rb'
9
12
  require_relative './manasimu/game.rb'
10
13
  require_relative './manasimu/simulator.rb'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: manasimu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.13
4
+ version: 0.0.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - so1itaryrove
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-05-14 00:00:00.000000000 Z
11
+ date: 2022-05-22 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: mtg arrena mana curve simulator
14
14
  email: so1itaryrove@gmail.com
@@ -20,8 +20,10 @@ files:
20
20
  - ext/ford_fulkerson.so
21
21
  - lib/manasimu.rb
22
22
  - lib/manasimu/card.rb
23
+ - lib/manasimu/card/basicland.rb
23
24
  - lib/manasimu/card/pathway.rb
24
25
  - lib/manasimu/card/slowland.rb
26
+ - lib/manasimu/card/snc_fetchland.rb
25
27
  - lib/manasimu/card/tapland.rb
26
28
  - lib/manasimu/data.rb
27
29
  - lib/manasimu/game.rb