mgmg 1.3.1 → 1.3.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -1
- data/README.md +9 -0
- data/lib/mgmg.rb +7 -0
- data/lib/mgmg/optimize.rb +213 -0
- data/lib/mgmg/poly.rb +72 -0
- data/lib/mgmg/search.rb +29 -5
- data/lib/mgmg/utils.rb +3 -0
- data/lib/mgmg/version.rb +1 -1
- metadata +8 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d35a19c90c58e70a8410540581af727523ea22584580bbf5ccf3b50fd19cbe4c
|
4
|
+
data.tar.gz: ca9c6122b4d7d84389787a10ac7073e5f3f633d1c1fffab58be1ad693e3613d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ab690d14c5d159646fa354b551eefe5a2afb7ab8c227769cdd5397262c5b810776611c3171c88af3143a96b18eac10050348c80c9b9801fc809544ec7291414d
|
7
|
+
data.tar.gz: a17fafc6c8eefdca6a137b0311f2e8ca1e44c71a8ea8a6341359ab6929d6b25228b8d0be96ef06ee29be514e0abfaa93cbc1a0f45ae1cb746175d39ad7a3207d
|
data/CHANGELOG.md
CHANGED
@@ -30,7 +30,7 @@
|
|
30
30
|
- マニュアル等の不備を修正.
|
31
31
|
|
32
32
|
## 1.0.9 2019/05/30
|
33
|
-
- 丸めを無視した多項式近似(変数は製作レベル)
|
33
|
+
- 丸めを無視した多項式近似(変数は製作レベル)を表す`Mgmg::TPolynomial`およびこれを生成するメソッド`String#poly`を追加.
|
34
34
|
|
35
35
|
## 1.0.10 2019/06/29
|
36
36
|
- 消費エレメント量を返す`Mgmg::Equip#total_cost`を追加.
|
@@ -93,3 +93,9 @@
|
|
93
93
|
- `Mgmg.#exp`に3引数を与えられるように修正.
|
94
94
|
- `String#search`,`Enumerable#search`を追加.
|
95
95
|
- `Enumerable#min_levels`,`Enumerable#min_level`,`Enumerable#min_smith`,`Enumerable#min_comp`を追加.
|
96
|
+
|
97
|
+
## 1.3.2 2021/05/18
|
98
|
+
- `Mgmg::TPolynomial`に比較演算子を追加.
|
99
|
+
- `String#phydef_optimize`,`String#buster_optimize`を追加.
|
100
|
+
- (`Enumerable#search`から呼び出される)`Enumerable#comp_search`における最大道具製作レベルチェックが間違っていたバグを修正.
|
101
|
+
- `String#search`および`Enumerable#search`において,総経験値量が等しい組み合わせの場合,目標パラメータが大きくなる製作Lvの組み合わせを返すように修正.
|
data/README.md
CHANGED
@@ -174,6 +174,15 @@ puts '小竜咆哮'.build
|
|
174
174
|
### `String#peff(para, smith, comp=smith, left_associative: true)`
|
175
175
|
近似多項式における偏微分値を使用した場合の,`String#eff`と同様の値を返します.`self.poly(para, left_associative: left_associative).eff(smith, comp)`と等価です.
|
176
176
|
|
177
|
+
### `String#phydef_optimize(smith=nil, comp=smith, left_associative: true, magdef_maximize: true)`
|
178
|
+
反転物防装備の反転材の種別,素材の最適化を行い,修正したレシピを返します.
|
179
|
+
`smith`,`comp`は探索を行う製作レベルを表し,`smith`が`nil`の場合,近似多項式で最適化を行います.近似多項式では,道具製作レベルの次数が高い項の係数を最適化します.
|
180
|
+
物防を最大化するレシピのうち,`magdef_maximize`が真なら魔防を最大化する組み合わせ,偽ならコストを最小化(≒魔防を最小化)する組み合わせを探索します.
|
181
|
+
ある範囲での全数探索を行うため,段数の多いレシピでは計算量が膨大になるほか,厳密な最適化を保証するものではなく,今後のアップデートで解が変わるような変更が入る可能性があります.
|
182
|
+
|
183
|
+
### `String#buster_optimize(smith=nil, comp=smith, left_associative: true)`
|
184
|
+
`String#phydef_optimize`の魔力弓版で,反転材の素材の最適化を行い,修正したレシピを返します.
|
185
|
+
|
177
186
|
### `Mgmg::Equip`
|
178
187
|
前述の`String#build`によって生成される装備品のクラスです.複数装備の合計値を表す「複数装備」という種別の装備品の場合もあります.以下のようなインスタンスメソッドが定義されています.
|
179
188
|
|
data/lib/mgmg.rb
CHANGED
@@ -5,6 +5,7 @@ require_relative './mgmg/equip'
|
|
5
5
|
require_relative './mgmg/poly'
|
6
6
|
require_relative './mgmg/system_equip'
|
7
7
|
require_relative './mgmg/search'
|
8
|
+
require_relative './mgmg/optimize'
|
8
9
|
|
9
10
|
class String
|
10
11
|
def min_level(w=1)
|
@@ -70,6 +71,12 @@ class String
|
|
70
71
|
puts "with levels (#{smith}, #{comp}) yields (#{pstr}, #{built.total_cost})"
|
71
72
|
puts " #{built}"
|
72
73
|
end
|
74
|
+
def phydef_optimize(smith=nil, comp=smith, left_associative: true, magdef_maximize: true)
|
75
|
+
Mgmg::Optimize.phydef_optimize(self, smith, comp, left_associative: left_associative, magdef_maximize: magdef_maximize)
|
76
|
+
end
|
77
|
+
def buster_optimize(smith=nil, comp=smith, left_associative: true)
|
78
|
+
Mgmg::Optimize.buster_optimize(self, smith, comp, left_associative: left_associative)
|
79
|
+
end
|
73
80
|
end
|
74
81
|
module Enumerable
|
75
82
|
def build(smith=-1, armor=smith, comp=armor.tap{armor=smith}, left_associative: true)
|
@@ -0,0 +1,213 @@
|
|
1
|
+
module Mgmg
|
2
|
+
module Optimize; end
|
3
|
+
class << Optimize
|
4
|
+
InvList = [%w|帽子 フード サンダル|.freeze, %w|宝1 骨1 木1 木2 骨2|.freeze, %w|宝1 骨1 木1|.freeze].freeze
|
5
|
+
def phydef_optimize(str, smith, comp=smith, left_associative: true, magdef_maximize: true)
|
6
|
+
best = ( smith.nil? ? [str, str.poly(:phydef), str.poly(:magdef), str.poly(:cost)] : [str, str.build(smith, comp)] )
|
7
|
+
str = Mgmg.check_string(str)
|
8
|
+
ai = 0
|
9
|
+
while str.sub!(/(帽子|フード|サンダル)\([宝木骨][12][宝木骨]1\)/){
|
10
|
+
ai += 1
|
11
|
+
"<A#{ai}>"
|
12
|
+
}; end
|
13
|
+
bi = 0
|
14
|
+
while str.sub!(/[宝木骨]1\)/){
|
15
|
+
bi += 1
|
16
|
+
"<B#{bi}>)"
|
17
|
+
}; end
|
18
|
+
skin = false
|
19
|
+
m = /([^\+]*\([^\(]+[綿皮]1\))\]*\Z/.match(str)
|
20
|
+
if m
|
21
|
+
if smith
|
22
|
+
if m[1].sub(/綿1\)/, '皮1)').build(smith).weight == m[1].sub(/皮1\)/, '綿1)').build(smith).weight
|
23
|
+
skin = true
|
24
|
+
end
|
25
|
+
else
|
26
|
+
skin = true
|
27
|
+
end
|
28
|
+
str = str.sub(/皮(1\)\]*)\Z/) do
|
29
|
+
"綿#{$1}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
a = Array.new(ai){ [0, 0, 0] }
|
33
|
+
b0 = Array.new(bi){ 0 }
|
34
|
+
while a
|
35
|
+
b = b0
|
36
|
+
while b
|
37
|
+
r = pd_apply_idx(str, a, b)
|
38
|
+
best = pd_better(best, ( smith.nil? ? [r, r.poly(:phydef), r.poly(:magdef), r.poly(:cost)] : [r, r.build(smith, comp)] ), magdef_maximize)
|
39
|
+
b = pd_next_b(b)
|
40
|
+
end
|
41
|
+
a = pd_next_a(a)
|
42
|
+
end
|
43
|
+
if skin
|
44
|
+
str = str.sub(/綿(1\)\]*)\Z/) do
|
45
|
+
"皮#{$1}"
|
46
|
+
end
|
47
|
+
a = Array.new(ai){ [0, 0, 0] }
|
48
|
+
while a
|
49
|
+
b = b0
|
50
|
+
while b
|
51
|
+
r = pd_apply_idx(str, a, b)
|
52
|
+
best = pd_better(best, ( smith.nil? ? [r, r.poly(:phydef), r.poly(:magdef), r.poly(:cost)] : [r, r.build(smith, comp)] ), magdef_maximize)
|
53
|
+
b = pd_next_b(b)
|
54
|
+
end
|
55
|
+
a = pd_next_a(a)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
best[0]
|
59
|
+
end
|
60
|
+
private def pd_better(pre, cur, mag)
|
61
|
+
case pre.size
|
62
|
+
when 2
|
63
|
+
if pre[1].phydef < cur[1].phydef
|
64
|
+
return cur
|
65
|
+
elsif pre[1].phydef == cur[1].phydef
|
66
|
+
if mag
|
67
|
+
if pre[1].magdef < cur[1].magdef
|
68
|
+
return cur
|
69
|
+
elsif pre[1].magdef == cur[1].magdef
|
70
|
+
if cur[1].total_cost.sum < pre[1].total_cost.sum
|
71
|
+
return cur
|
72
|
+
end
|
73
|
+
end
|
74
|
+
else
|
75
|
+
if cur[1].comp_cost < pre[1].comp_cost
|
76
|
+
return cur
|
77
|
+
elsif cur[1].comp_cost == pre[1].comp_cost
|
78
|
+
if cur[1].total_cost.sum < pre[1].total_cost.sum
|
79
|
+
return cur
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
return pre
|
85
|
+
when 4
|
86
|
+
if pre[1] < cur[1]
|
87
|
+
return cur
|
88
|
+
elsif pre[1] == cur[1]
|
89
|
+
if mag
|
90
|
+
if pre[2] < cur[2]
|
91
|
+
return cur
|
92
|
+
elsif pre[2] == cur[2]
|
93
|
+
if cur[3] < pre[3]
|
94
|
+
return cur
|
95
|
+
end
|
96
|
+
end
|
97
|
+
else
|
98
|
+
if cur[3] < pre[3]
|
99
|
+
return cur
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
return pre
|
104
|
+
else
|
105
|
+
raise "Unexpected Error"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
private def pd_apply_idx(str, a, b)
|
109
|
+
a.each.with_index do |aa, i|
|
110
|
+
str = str.sub("<A#{i+1}>", "#{InvList[0][aa[0]]}(#{InvList[1][aa[1]]}#{InvList[2][aa[2]]})")
|
111
|
+
end
|
112
|
+
b.each.with_index do |bb, i|
|
113
|
+
str = str.sub("<B#{i+1}>", InvList[2][bb])
|
114
|
+
end
|
115
|
+
str
|
116
|
+
end
|
117
|
+
private def pd_next_b_full(b)
|
118
|
+
0.upto(b.length-1) do |i|
|
119
|
+
b[i] += 1
|
120
|
+
if b[i] == InvList[2].size
|
121
|
+
b[i] = 0
|
122
|
+
else
|
123
|
+
return b
|
124
|
+
end
|
125
|
+
end
|
126
|
+
nil
|
127
|
+
end
|
128
|
+
private def pd_next_b(b)
|
129
|
+
if b[0] == 0
|
130
|
+
return Array.new(b.length, 1)
|
131
|
+
end
|
132
|
+
nil
|
133
|
+
end
|
134
|
+
private def pd_next_a(a)
|
135
|
+
0.upto(a.length-1) do |i|
|
136
|
+
0.upto(2) do |j|
|
137
|
+
a[i][j] += 1
|
138
|
+
if a[i][j] == InvList[j].size
|
139
|
+
a[i][j] = 0
|
140
|
+
else
|
141
|
+
return a
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
nil
|
146
|
+
end
|
147
|
+
|
148
|
+
MwList = %w|綿 皮 骨 木 水|.freeze
|
149
|
+
def buster_optimize(str, smith, comp=smith, left_associative: true)
|
150
|
+
best = ( smith.nil? ? [str, str.poly(:mag_das)] : [str, str.build(smith, comp)] )
|
151
|
+
str = Mgmg.check_string(str)
|
152
|
+
ai = -1
|
153
|
+
org = nil
|
154
|
+
while str.sub!(/弓\(([骨水綿皮木][12][骨水綿皮木]1)\)/){
|
155
|
+
ai += 1
|
156
|
+
if ai == 0
|
157
|
+
org = $1.dup
|
158
|
+
end
|
159
|
+
"弓(<A#{ai}>)"
|
160
|
+
}; end
|
161
|
+
str = str.sub(/<A0>/, org)
|
162
|
+
a = Array.new(ai){ [0, 0, 0] }
|
163
|
+
while a
|
164
|
+
r = bus_apply_idx(str, a)
|
165
|
+
best = bus_better(best, ( smith.nil? ? [r, r.poly(:mag_das)] : [r, r.build(smith, comp)] ))
|
166
|
+
a = bus_next_a(a)
|
167
|
+
end
|
168
|
+
best[0]
|
169
|
+
end
|
170
|
+
private def bus_apply_idx(str, a)
|
171
|
+
a.each.with_index do |aa, i|
|
172
|
+
str = str.sub("<A#{i+1}>", "#{MwList[aa[0]]}#{aa[1]+1}#{MwList[aa[2]]}1")
|
173
|
+
end
|
174
|
+
str
|
175
|
+
end
|
176
|
+
private def bus_better(pre, cur)
|
177
|
+
if pre[1].kind_of?(Mgmg::Equip)
|
178
|
+
if pre[1].mag_das < cur[1].mag_das
|
179
|
+
return cur
|
180
|
+
elsif pre[1].mag_das == cur[1].mag_das
|
181
|
+
if cur[1].total_cost.sum < pre[1].total_cost.sum
|
182
|
+
return cur
|
183
|
+
end
|
184
|
+
end
|
185
|
+
return pre
|
186
|
+
else
|
187
|
+
if pre[1] < cur[1]
|
188
|
+
return cur
|
189
|
+
end
|
190
|
+
return pre
|
191
|
+
end
|
192
|
+
end
|
193
|
+
private def bus_next_a(a)
|
194
|
+
0.upto(a.length-1) do |i|
|
195
|
+
[0, 2].each do |j|
|
196
|
+
a[i][j] += 1
|
197
|
+
if a[i][j] == 5
|
198
|
+
a[i][j] = 0
|
199
|
+
else
|
200
|
+
return a
|
201
|
+
end
|
202
|
+
end
|
203
|
+
a[i][1] += 1
|
204
|
+
if a[i][1] == 2
|
205
|
+
a[i][1] = 0
|
206
|
+
else
|
207
|
+
return a
|
208
|
+
end
|
209
|
+
end
|
210
|
+
nil
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
data/lib/mgmg/poly.rb
CHANGED
@@ -139,10 +139,12 @@ module Mgmg
|
|
139
139
|
ret
|
140
140
|
end
|
141
141
|
def +(other)
|
142
|
+
other = self.coerce(other)[0] unless other.kind_of?(self.class)
|
142
143
|
mat = @mat.padd(other.mat)
|
143
144
|
self.class.new(mat, 28, 0, 12, 12)
|
144
145
|
end
|
145
146
|
def -(other)
|
147
|
+
other = self.coerce(other)[0] unless other.kind_of?(self.class)
|
146
148
|
mat = @mat.padd(other.mat.scalar(-1))
|
147
149
|
self.class.new(mat, 28, 0, 12, 12)
|
148
150
|
end
|
@@ -204,6 +206,76 @@ module Mgmg
|
|
204
206
|
end
|
205
207
|
ret.nil? ? 0 : ret
|
206
208
|
end
|
209
|
+
|
210
|
+
def coerce(other)
|
211
|
+
[self.class.new(Mat.new(1, 1, other), 28, 0, 12, 12), self]
|
212
|
+
end
|
213
|
+
def <(other)
|
214
|
+
foo = self-other
|
215
|
+
(foo.mat.row_size-1).downto(0) do |s|
|
216
|
+
(foo.mat.col_size-1).downto(0) do |c|
|
217
|
+
bar = foo.mat.body[s][c]
|
218
|
+
if bar < 0
|
219
|
+
return true
|
220
|
+
elsif 0 < bar
|
221
|
+
return false
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
225
|
+
false
|
226
|
+
end
|
227
|
+
def <=(other)
|
228
|
+
foo = self-other
|
229
|
+
(foo.mat.row_size-1).downto(0) do |s|
|
230
|
+
(foo.mat.col_size-1).downto(0) do |c|
|
231
|
+
bar = foo.mat.body[s][c]
|
232
|
+
if bar < 0
|
233
|
+
return true
|
234
|
+
elsif 0 < bar
|
235
|
+
return false
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
true
|
240
|
+
end
|
241
|
+
def >(other)
|
242
|
+
foo = other-self
|
243
|
+
(foo.mat.row_size-1).downto(0) do |s|
|
244
|
+
(foo.mat.col_size-1).downto(0) do |c|
|
245
|
+
bar = foo.mat.body[s][c]
|
246
|
+
if bar < 0
|
247
|
+
return true
|
248
|
+
elsif 0 < bar
|
249
|
+
return false
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
253
|
+
false
|
254
|
+
end
|
255
|
+
def >=(other)
|
256
|
+
foo = other-self
|
257
|
+
(foo.mat.row_size-1).downto(0) do |s|
|
258
|
+
(foo.mat.col_size-1).downto(0) do |c|
|
259
|
+
bar = foo.mat.body[s][c]
|
260
|
+
if bar < 0
|
261
|
+
return true
|
262
|
+
elsif 0 < bar
|
263
|
+
return false
|
264
|
+
end
|
265
|
+
end
|
266
|
+
end
|
267
|
+
true
|
268
|
+
end
|
269
|
+
def ==(other)
|
270
|
+
foo = self-other
|
271
|
+
(foo.mat.row_size-1).downto(0) do |s|
|
272
|
+
(foo.mat.col_size-1).downto(0) do |c|
|
273
|
+
bar = foo.mat.body[s][c]
|
274
|
+
return false if bar != 0
|
275
|
+
end
|
276
|
+
end
|
277
|
+
true
|
278
|
+
end
|
207
279
|
end
|
208
280
|
class << TPolynomial
|
209
281
|
ParamIndex = Hash.new
|
data/lib/mgmg/search.rb
CHANGED
@@ -72,7 +72,13 @@ class String
|
|
72
72
|
break if minex < Mgmg.exp(smith_min, comp)
|
73
73
|
smith = smith_search(para, target, comp, smith_min, smith_max, left_associative: left_associative, cut_exp: [minex, cut_exp].min)
|
74
74
|
exp = Mgmg.exp(smith, comp)
|
75
|
-
|
75
|
+
if exp < minex
|
76
|
+
minex, ret = exp, [smith, comp]
|
77
|
+
elsif exp == minex
|
78
|
+
if build(*ret).para_call(para) < build(smith, comp).para_call(para)
|
79
|
+
ret = [smith, comp]
|
80
|
+
end
|
81
|
+
end
|
76
82
|
rescue Mgmg::SearchCutException
|
77
83
|
end
|
78
84
|
raise Mgmg::SearchCutException, "the result exceeds given cut_exp=#{cut_exp}" if cut_exp < minex
|
@@ -165,7 +171,13 @@ module Enumerable
|
|
165
171
|
break if minex < Mgmg.exp(smith_min, armor, comp)
|
166
172
|
smith = smith_search(para, target, armor, comp, smith_min, smith_max, left_associative: left_associative, cut_exp: [minex, cut_exp].min)
|
167
173
|
exp = Mgmg.exp(smith, armor, comp)
|
168
|
-
|
174
|
+
if exp < minex
|
175
|
+
minex, ret = exp, [smith, armor]
|
176
|
+
elsif exp == minex
|
177
|
+
if build(*ret, comp).para_call(para) < build(smith, armor, comp).para_call(para)
|
178
|
+
ret = [smith, armor]
|
179
|
+
end
|
180
|
+
end
|
169
181
|
rescue Mgmg::SearchCutException
|
170
182
|
end
|
171
183
|
else
|
@@ -173,7 +185,13 @@ module Enumerable
|
|
173
185
|
break if minex < Mgmg.exp(smith, armor_min, comp)
|
174
186
|
armor = armor_search(para, target, smith, comp, armor_min, armor_max, left_associative: left_associative, cut_exp: [minex, cut_exp].min)
|
175
187
|
exp = Mgmg.exp(smith, armor, comp)
|
176
|
-
|
188
|
+
if exp < minex
|
189
|
+
minex, ret = exp, [smith, armor]
|
190
|
+
elsif exp == minex
|
191
|
+
if build(*ret, comp).para_call(para) < build(smith, armor, comp).para_call(para)
|
192
|
+
ret = [smith, armor]
|
193
|
+
end
|
194
|
+
end
|
177
195
|
rescue Mgmg::SearchCutException
|
178
196
|
end
|
179
197
|
end
|
@@ -187,7 +205,7 @@ module Enumerable
|
|
187
205
|
end
|
188
206
|
if target <= build(smith, armor, comp_min, left_associative: left_associative).para_call(para)
|
189
207
|
return comp_min
|
190
|
-
elsif build(smith, comp_max, left_associative: left_associative).para_call(para) < target
|
208
|
+
elsif build(smith, armor, comp_max, left_associative: left_associative).para_call(para) < target
|
191
209
|
raise ArgumentError, "given comp_max=#{comp_max} does not satisfies the target"
|
192
210
|
end
|
193
211
|
while 1 < comp_max - comp_min do
|
@@ -221,7 +239,13 @@ module Enumerable
|
|
221
239
|
break if minex < Mgmg.exp(smith_min, armor_min, comp)
|
222
240
|
smith, armor = sa_search(para, target, comp, smith_min, armor_min, smith_max, armor_max, left_associative: left_associative, cut_exp: [minex, cut_exp].min)
|
223
241
|
exp = Mgmg.exp(smith, armor, comp)
|
224
|
-
|
242
|
+
if exp < minex
|
243
|
+
minex, ret = exp, [smith, armor, comp]
|
244
|
+
elsif exp == minex
|
245
|
+
if build(*ret).para_call(para) < build(smith, armor, comp).para_call(para)
|
246
|
+
ret = [smith, armor, comp]
|
247
|
+
end
|
248
|
+
end
|
225
249
|
rescue Mgmg::SearchCutException
|
226
250
|
end
|
227
251
|
raise Mgmg::SearchCutException, "the result exceeds given cut_exp=#{cut_exp}" if cut_exp < minex
|
data/lib/mgmg/utils.rb
CHANGED
data/lib/mgmg/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mgmg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- KAZOON
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-05-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,7 +52,7 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 1.2.3
|
55
|
-
description:
|
55
|
+
description:
|
56
56
|
email:
|
57
57
|
- cycloawaodorin+gem@gmail.com
|
58
58
|
executables: []
|
@@ -70,6 +70,7 @@ files:
|
|
70
70
|
- lib/mgmg.rb
|
71
71
|
- lib/mgmg/const.rb
|
72
72
|
- lib/mgmg/equip.rb
|
73
|
+
- lib/mgmg/optimize.rb
|
73
74
|
- lib/mgmg/poly.rb
|
74
75
|
- lib/mgmg/search.rb
|
75
76
|
- lib/mgmg/system_equip.rb
|
@@ -82,7 +83,7 @@ metadata:
|
|
82
83
|
homepage_uri: https://github.com/cycloawaodorin/
|
83
84
|
source_code_uri: https://github.com/cycloawaodorin/mgmg
|
84
85
|
changelog_uri: https://github.com/cycloawaodorin/mgmg/blob/master/CHANGELOG.md
|
85
|
-
post_install_message:
|
86
|
+
post_install_message:
|
86
87
|
rdoc_options: []
|
87
88
|
require_paths:
|
88
89
|
- lib
|
@@ -97,8 +98,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
97
98
|
- !ruby/object:Gem::Version
|
98
99
|
version: '0'
|
99
100
|
requirements: []
|
100
|
-
rubygems_version: 3.
|
101
|
-
signing_key:
|
101
|
+
rubygems_version: 3.2.17
|
102
|
+
signing_key:
|
102
103
|
specification_version: 4
|
103
104
|
summary: Calculate specs of equipments of Megurimeguru, a game produced by Kou.
|
104
105
|
test_files: []
|