manasimu 0.0.11 → 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.
- checksums.yaml +4 -4
- data/lib/manasimu/card/slowland.rb +32 -0
- data/lib/manasimu/card/tapland.rb +9 -3
- data/lib/manasimu/card.rb +76 -15
- data/lib/manasimu/data.rb +4 -1
- data/lib/manasimu/game.rb +4 -2
- data/lib/manasimu/planner.rb +3 -0
- data/lib/manasimu.rb +1 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3c73ee6bfefc5a1611b3170d86b8dc27dbf75c58f2dc3f2be7d570679cedfab3
|
4
|
+
data.tar.gz: f771ef43cafe46bcc75eed2c0964c42e39f32d7c1ab92a0e09e1a5b6ad6b4845
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c1e61d71e665d98b74a8cfa52d877e2131be56484fdee9d78d85b1e072d5ffa5172444b7c0683c30c94e113f9876048b31d4bbb4af528fac08296d2650bb6ce1
|
7
|
+
data.tar.gz: 5a6ea06c33e3227a1f4f74be5a6d4266069090ecda660e29ad7c9b717891367d4764943726f2a0cd32632fafd6e58e505526c6809ed0da87e67b3b133382dd7d
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class SlowLandCard < Card
|
2
|
+
|
3
|
+
def resolve(side, hands, plays)
|
4
|
+
super(side, hands, plays)
|
5
|
+
num = 0
|
6
|
+
for card in plays do
|
7
|
+
next if card == self
|
8
|
+
num += 1 if card.is_land?
|
9
|
+
break if num >= 2
|
10
|
+
end
|
11
|
+
|
12
|
+
if num == 2
|
13
|
+
@tapped = false
|
14
|
+
else
|
15
|
+
@tapped = true
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def step_in_plays(turn)
|
20
|
+
super(turn)
|
21
|
+
@tapped = false
|
22
|
+
end
|
23
|
+
|
24
|
+
def tapped?
|
25
|
+
@tapped
|
26
|
+
end
|
27
|
+
|
28
|
+
def reset
|
29
|
+
super
|
30
|
+
@tapped = false
|
31
|
+
end
|
32
|
+
end
|
@@ -4,12 +4,18 @@ class TapLandCard < Card
|
|
4
4
|
@tapped
|
5
5
|
end
|
6
6
|
|
7
|
-
def
|
8
|
-
super(
|
7
|
+
def resolve(side, hands, plays)
|
8
|
+
super(side, hands, plays)
|
9
9
|
@tapped = true
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
12
|
+
def step_in_plays(turn)
|
13
|
+
super(turn)
|
14
|
+
@tapped = false
|
15
|
+
end
|
16
|
+
|
17
|
+
def reset
|
18
|
+
super
|
13
19
|
@tapped = false
|
14
20
|
end
|
15
21
|
end
|
data/lib/manasimu/card.rb
CHANGED
@@ -3,9 +3,16 @@ class Card
|
|
3
3
|
|
4
4
|
def initialize(card_type)
|
5
5
|
@card_type = card_type
|
6
|
+
@playable = false
|
6
7
|
end
|
7
8
|
|
8
|
-
def
|
9
|
+
def step_in_hands(turn)
|
10
|
+
@card_type.step_in_hands(turn - 1, self)
|
11
|
+
@can_play = false
|
12
|
+
end
|
13
|
+
|
14
|
+
def step_in_plays(turn)
|
15
|
+
@card_type.step_in_plays(turn - 1, self)
|
9
16
|
end
|
10
17
|
|
11
18
|
def drawed(turn)
|
@@ -16,7 +23,12 @@ class Card
|
|
16
23
|
def played(turn, side = "a")
|
17
24
|
@played = turn
|
18
25
|
@side = side
|
19
|
-
|
26
|
+
if not is_land? or not tapped?
|
27
|
+
@card_type.played(turn)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def resolve(side = "a", hands, plays)
|
20
32
|
end
|
21
33
|
|
22
34
|
def played?
|
@@ -32,7 +44,13 @@ class Card
|
|
32
44
|
end
|
33
45
|
|
34
46
|
def playable?(lands, capas)
|
35
|
-
@card_type.playable?(lands, capas)
|
47
|
+
ret = @card_type.playable?(lands, capas)
|
48
|
+
@can_play = true if ret and ret[0]
|
49
|
+
ret
|
50
|
+
end
|
51
|
+
|
52
|
+
def can_play?
|
53
|
+
@can_play
|
36
54
|
end
|
37
55
|
|
38
56
|
def types
|
@@ -65,6 +83,13 @@ class Card
|
|
65
83
|
|
66
84
|
def reset
|
67
85
|
@side = nil
|
86
|
+
@played = nil
|
87
|
+
@drawed = nil
|
88
|
+
@can_play = false
|
89
|
+
end
|
90
|
+
|
91
|
+
def is_land?
|
92
|
+
@card_type.is_land? @side
|
68
93
|
end
|
69
94
|
|
70
95
|
def max_flow(lands, capas)
|
@@ -88,19 +113,25 @@ class Card
|
|
88
113
|
end
|
89
114
|
|
90
115
|
class CardType
|
91
|
-
attr_accessor :contents, :played, :drawed, :name
|
116
|
+
attr_accessor :contents, :played, :drawed, :name, :can_plays, :mana_sources
|
92
117
|
|
93
118
|
def self.create(card_type, name)
|
94
119
|
ret = card_type.dup
|
95
120
|
ret.contents = card_type.contents
|
96
|
-
ret.played =
|
97
|
-
ret.drawed =
|
121
|
+
ret.played = {}
|
122
|
+
ret.drawed = {}
|
123
|
+
ret.can_plays = {}
|
124
|
+
ret.mana_sources = {}
|
98
125
|
ret.name = name
|
99
126
|
ret
|
100
127
|
end
|
101
128
|
|
102
129
|
def initialize(contents)
|
103
130
|
return if not contents
|
131
|
+
@played = {}
|
132
|
+
@drawed = {}
|
133
|
+
@can_plays = {}
|
134
|
+
@mana_sources = {}
|
104
135
|
@contents = contents.map {|c| Content.new(c)}
|
105
136
|
end
|
106
137
|
|
@@ -108,14 +139,30 @@ class CardType
|
|
108
139
|
@name ||= @contents[0].name
|
109
140
|
end
|
110
141
|
|
142
|
+
def step_in_hands(turn, card)
|
143
|
+
if turn >= 0 and card.can_play?
|
144
|
+
@can_plays[turn] ||= 0
|
145
|
+
@can_plays[turn] += 1
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def step_in_plays(turn, card)
|
150
|
+
if turn >= 0 and card.mana_source? and not card.tapped?
|
151
|
+
@mana_sources[turn] ||= {}
|
152
|
+
size = card.color_identity.length
|
153
|
+
card.color_identity.each do |c|
|
154
|
+
@mana_sources[turn][c] ||= 0
|
155
|
+
@mana_sources[turn][c] += 1.0 / size
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
111
160
|
def played(turn)
|
112
|
-
@played ||= {}
|
113
161
|
@played[turn] ||= 0
|
114
162
|
@played[turn] += 1
|
115
163
|
end
|
116
164
|
|
117
165
|
def drawed(turn)
|
118
|
-
@drawed ||= {}
|
119
166
|
@drawed[turn] ||= 0
|
120
167
|
@drawed[turn] += 1
|
121
168
|
end
|
@@ -189,6 +236,21 @@ class CardType
|
|
189
236
|
converted_mana_cost
|
190
237
|
end
|
191
238
|
|
239
|
+
def is_land?(side = nil)
|
240
|
+
return @is_land if @is_land
|
241
|
+
arr = if side == 'a'
|
242
|
+
[0]
|
243
|
+
elsif side == 'b'
|
244
|
+
[1]
|
245
|
+
else
|
246
|
+
[0,1]
|
247
|
+
end
|
248
|
+
@is_land = arr.select do |i|
|
249
|
+
@contents[i] and @contents[i].types == "Land"
|
250
|
+
end.length > 0
|
251
|
+
return @is_land
|
252
|
+
end
|
253
|
+
|
192
254
|
def playable?(lands, capas)
|
193
255
|
return [false, [], []] if lands.empty?
|
194
256
|
return [false, [], []] if converted_mana_cost > lands.length
|
@@ -266,15 +328,14 @@ class CardType
|
|
266
328
|
|
267
329
|
def count(turn = nil)
|
268
330
|
turn ||= converted_mana_cost
|
269
|
-
played = @played
|
331
|
+
played = @played [turn] || 0
|
270
332
|
drawed = 0
|
271
|
-
|
272
|
-
|
273
|
-
next if not @drawed[i]
|
274
|
-
drawed += @drawed[i]
|
275
|
-
end
|
333
|
+
(turn+1).times do |i|
|
334
|
+
drawed += @drawed[i] || 0
|
276
335
|
end
|
277
|
-
[
|
336
|
+
can_played = @can_plays[turn] || 0
|
337
|
+
mana_sources = @mana_sources[turn] || {}
|
338
|
+
[played, drawed, can_played, mana_sources]
|
278
339
|
end
|
279
340
|
|
280
341
|
def to_s
|
data/lib/manasimu/data.rb
CHANGED
@@ -72,9 +72,12 @@ class Deck
|
|
72
72
|
card_types << clone
|
73
73
|
if clone.name =~ /.*Pathway$/ and clone.mana_source?
|
74
74
|
card = PathwayCard.new(clone)
|
75
|
-
elsif clone.
|
75
|
+
elsif clone.is_land? and
|
76
76
|
clone.contents[0].text =~ /enters the battlefield tapped\./
|
77
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)
|
78
81
|
else
|
79
82
|
card = Card.new(clone)
|
80
83
|
end
|
data/lib/manasimu/game.rb
CHANGED
@@ -25,7 +25,8 @@ class Game
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def upkeep(turn)
|
28
|
-
@
|
28
|
+
@hands.each { |card| card.step_in_hands(turn) }
|
29
|
+
@plays.each { |card| card.step_in_plays(turn) }
|
29
30
|
end
|
30
31
|
|
31
32
|
def draw(turn)
|
@@ -41,7 +42,8 @@ class Game
|
|
41
42
|
|
42
43
|
def play(card, turn)
|
43
44
|
# puts "play #{card}"
|
44
|
-
card.
|
45
|
+
card.resolve(nil, @hands, @plays)
|
46
|
+
card.played(turn, nil)
|
45
47
|
@plays << card
|
46
48
|
@hands.delete card
|
47
49
|
end
|
data/lib/manasimu/planner.rb
CHANGED
@@ -18,6 +18,7 @@ class Planner
|
|
18
18
|
# play the land
|
19
19
|
current_hands.delete play_land
|
20
20
|
current_fields << play_land
|
21
|
+
play_land.resolve(nil, current_hands, current_fields)
|
21
22
|
|
22
23
|
# search_opt_spells
|
23
24
|
price, spells, symbols, lands =
|
@@ -29,6 +30,8 @@ class Planner
|
|
29
30
|
max_symbols = symbols
|
30
31
|
max_lands = lands
|
31
32
|
end
|
33
|
+
|
34
|
+
play_land.reset
|
32
35
|
end
|
33
36
|
else
|
34
37
|
# search_opt_spells
|
data/lib/manasimu.rb
CHANGED
@@ -4,6 +4,7 @@ Bundler.require
|
|
4
4
|
require_relative './manasimu/card.rb'
|
5
5
|
require_relative './manasimu/card/pathway.rb'
|
6
6
|
require_relative './manasimu/card/tapland.rb'
|
7
|
+
require_relative './manasimu/card/slowland.rb'
|
7
8
|
require_relative './manasimu/planner.rb'
|
8
9
|
require_relative './manasimu/game.rb'
|
9
10
|
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.14
|
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-15 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: mtg arrena mana curve simulator
|
14
14
|
email: so1itaryrove@gmail.com
|
@@ -21,6 +21,7 @@ files:
|
|
21
21
|
- lib/manasimu.rb
|
22
22
|
- lib/manasimu/card.rb
|
23
23
|
- lib/manasimu/card/pathway.rb
|
24
|
+
- lib/manasimu/card/slowland.rb
|
24
25
|
- lib/manasimu/card/tapland.rb
|
25
26
|
- lib/manasimu/data.rb
|
26
27
|
- lib/manasimu/game.rb
|