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 +4 -4
- data/db/card_type_aggregate +0 -0
- data/lib/manasimu/card/basicland.rb +3 -0
- data/lib/manasimu/card/pathway.rb +2 -1
- data/lib/manasimu/card/slowland.rb +5 -2
- data/lib/manasimu/card/snc_fetchland.rb +55 -0
- data/lib/manasimu/card/tapland.rb +5 -2
- data/lib/manasimu/card.rb +120 -39
- data/lib/manasimu/data.rb +16 -8
- data/lib/manasimu/game.rb +25 -17
- data/lib/manasimu/mana_type.rb +53 -5
- data/lib/manasimu/planner.rb +4 -3
- data/lib/manasimu/simulator.rb +5 -2
- data/lib/manasimu.rb +3 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3343e9db3fa8daa5303ccd50b555a5d5d25bd961d20c5392a8d526e8a78f425e
|
4
|
+
data.tar.gz: ddc59e45c459dfcd2cebb65d8104d0d25ac91a04bcb6ab387c0cd8bf285da24e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 67d7fb4abda302154d59c4de1e756c32c6b762a0d80c5fd7ce4c16fd6e3190509684796f8ee5a0c466066b1e32eba3f443366624909a2e0a2994ce4ceec9d65a
|
7
|
+
data.tar.gz: 2a8c4ec688061b5d55ae4c2d8c2832089975c55b9993b08edd1d795292e9312fba52a54232cf861291d55ccbb06c5da075217a9462d6feafeda62b998adcd959
|
data/db/card_type_aggregate
CHANGED
Binary file
|
@@ -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
|
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
|
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
|
10
|
-
|
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
|
-
|
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
|
55
|
-
@card_type.
|
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
|
-
@
|
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
|
133
|
-
if
|
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
|
-
@
|
196
|
+
@is_mana_source ||= @contents.any? {|content| content.mana_source?}
|
151
197
|
end
|
152
198
|
|
153
|
-
def
|
154
|
-
@
|
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
|
158
|
-
@
|
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
|
166
|
-
|
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.
|
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
|
-
|
309
|
-
|
366
|
+
played_count = @played[turn] || 0
|
367
|
+
drawed_count = 0
|
310
368
|
(turn+1).times do |i|
|
311
|
-
|
369
|
+
drawed_count += @drawed[i] || 0
|
312
370
|
end
|
313
|
-
|
314
|
-
[
|
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.
|
74
|
-
|
75
|
-
|
76
|
-
clone.contents[0].text =~ /enters the battlefield tapped\./
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
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
|
-
|
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
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
45
|
-
|
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
|
data/lib/manasimu/mana_type.rb
CHANGED
@@ -1,7 +1,55 @@
|
|
1
1
|
class ManaType
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
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
|
data/lib/manasimu/planner.rb
CHANGED
@@ -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.
|
72
|
+
b.mana_source_size <=> a.mana_source_size
|
72
73
|
end
|
73
74
|
|
74
75
|
price = 0
|
data/lib/manasimu/simulator.rb
CHANGED
@@ -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.
|
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-
|
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
|