mgmg 1.6.0 → 1.6.2
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/CHANGELOG.md +8 -0
- data/lib/mgmg/equip.rb +3 -0
- data/lib/mgmg/ir.rb +3 -0
- data/lib/mgmg/option.rb +4 -2
- data/lib/mgmg/recipe.rb +1 -1
- data/lib/mgmg/search.rb +13 -1
- data/lib/mgmg/version.rb +1 -1
- data/lib/mgmg.rb +9 -1
- data/reference.md +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0aee0bc2d348dfc0e23ce8556cea710f7645b6a590145f67bc1d5715b8c999a1
|
4
|
+
data.tar.gz: eed968af79443fabb9b65e931b93079a5dd8c839af6ea0b6f84a62c1ad411eda
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 218e8c123428a6ec6228c1d296973c8ec01ba77d09430c3e33e49df081364b2e3e295b4f02a480b5349a709dd26e955e8472852e872ba73dd87b2044ec690904
|
7
|
+
data.tar.gz: 1c9db46a5f5fe0fdcb76bc0fbeab261414e2d9df4661d3dfe91f137ab066e739584170695fc58868d5d64e1ddec578866a90fd9291c9a47eca31f3cfafab915d
|
data/CHANGELOG.md
CHANGED
@@ -169,3 +169,11 @@
|
|
169
169
|
## 1.6.0 2022/10/18
|
170
170
|
- `Mgmg.#find_upperbound`のアルゴリズムを改善し,探索下限目標値の引数を削除.
|
171
171
|
- `Enumerable#search`,`Enumerable#find_max`が正しい解を返さない場合があったバグを修正.
|
172
|
+
|
173
|
+
## 1.6.1 2022/10/21
|
174
|
+
- `Mgmg.#find_lowerbound`,`Mgmg.#find_upperbound`において,同値レシピを指定した場合などを例外とするように修正.
|
175
|
+
- `Enumerable#to_recipe`にも`allow_over20`キーワード引数を導入し,デフォルトで☆20を超えるレシピを含む場合に例外とするように修正.
|
176
|
+
- 実効HP(最大HP+腕力)を表す`Mgmg::Equip#hs`を追加.
|
177
|
+
|
178
|
+
## 1.6.2 2022/10/31
|
179
|
+
- 既製品を含むかどうかのチェックを行った場合,同じレシピについては繰り返しチェックしないようにして高速化した.
|
data/lib/mgmg/equip.rb
CHANGED
data/lib/mgmg/ir.rb
CHANGED
data/lib/mgmg/option.rb
CHANGED
@@ -33,9 +33,10 @@ module Mgmg
|
|
33
33
|
@irep = irep
|
34
34
|
@cut_exp = cut_exp
|
35
35
|
@include_system_equips = include_system_equips
|
36
|
+
@system_equips_checked = false
|
36
37
|
end
|
37
38
|
attr_accessor :left_associative, :smith_min, :armor_min, :comp_min, :smith_max, :armor_max, :comp_max
|
38
|
-
attr_accessor :step, :magdef_maximize, :target_weight, :reinforcement, :irep, :cut_exp, :include_system_equips
|
39
|
+
attr_accessor :step, :magdef_maximize, :target_weight, :reinforcement, :irep, :cut_exp, :include_system_equips, :system_equips_checked
|
39
40
|
def initialize_copy(other)
|
40
41
|
@left_associative = other.left_associative
|
41
42
|
@smith_min = other.smith_min
|
@@ -76,7 +77,7 @@ module Mgmg
|
|
76
77
|
self
|
77
78
|
end
|
78
79
|
def set_default(recipe, force: false)
|
79
|
-
if @include_system_equips
|
80
|
+
if (!@system_equips_checked) and @include_system_equips then
|
80
81
|
case recipe
|
81
82
|
when String
|
82
83
|
@include_system_equips = false unless Mgmg::SystemEquipRegexp.values.any?{|re| re.match(recipe)}
|
@@ -85,6 +86,7 @@ module Mgmg
|
|
85
86
|
else
|
86
87
|
raise ArgumentError, 'recipe should be String or Enumerable'
|
87
88
|
end
|
89
|
+
@system_equips_checked = true
|
88
90
|
end
|
89
91
|
update_sa_min(recipe, force)
|
90
92
|
@comp_min = recipe.min_comp(opt: self) if force || @comp_min.nil?
|
data/lib/mgmg/recipe.rb
CHANGED
@@ -130,7 +130,7 @@ module Mgmg
|
|
130
130
|
def ir(**kw)
|
131
131
|
temp_opt(**kw).irep
|
132
132
|
end
|
133
|
-
%i|attack phydef magdef hp mp str dex speed magic atkstr atk_sd dex_as mag_das magic2 magmag pmdef|.each do |sym|
|
133
|
+
%i|attack phydef magdef hp mp str dex speed magic atkstr atk_sd dex_as mag_das magic2 magmag pmdef hs|.each do |sym|
|
134
134
|
define_method(sym) do |s, ac=s, x=false, **kw|
|
135
135
|
s, ac, x = correct_level(s, ac, x, temp_opt(**kw))
|
136
136
|
ir(**kw).method(sym).call(s, ac, x)
|
data/lib/mgmg/search.rb
CHANGED
@@ -369,6 +369,13 @@ module Mgmg
|
|
369
369
|
pa, pb = opt_a.irep.para_call(para, *sca), opt_b.irep.para_call(para, *scb)
|
370
370
|
if eb < ea || ( ea == eb && pa < pb )
|
371
371
|
a, b, opt_a, opt_b, sca, scb, ea, eb = b, a, opt_b, opt_a, scb, sca, eb, ea
|
372
|
+
elsif eb == ea && pa == pb
|
373
|
+
raise Mgmg::SearchCutException, "given recipes are equivalent at start target=#{start.comma3}"
|
374
|
+
end
|
375
|
+
scat, scbt = a.search(para, term, opt: opt_a), b.search(para, term, opt: opt_b)
|
376
|
+
eat, ebt = Mgmg.exp(*scat), Mgmg.exp(*scbt)
|
377
|
+
if eat < ebt || ( eat == ebt && opt_b.irep.para_call(para, *scbt) <= opt_a.irep.para_call(para, *scat) )
|
378
|
+
raise Mgmg::SearchCutException, "given recipes will never be reversed from start target=#{start.comma3} until term target=#{term.comma3}"
|
372
379
|
end
|
373
380
|
|
374
381
|
loop do
|
@@ -419,13 +426,18 @@ module Mgmg
|
|
419
426
|
pa, pb = opt_a.irep.para_call(para, *sca), opt_b.irep.para_call(para, *scb)
|
420
427
|
if ea < eb || ( ea == eb && pb < pa )
|
421
428
|
a, b, opt_a, opt_b, sca, scb, ea, eb = b, a, opt_b, opt_a, scb, sca, eb, ea
|
429
|
+
elsif eb == ea && pa == pb
|
430
|
+
raise Mgmg::SearchCutException, "given recipes are equivalent at start target=#{start.comma3}"
|
422
431
|
end
|
423
432
|
|
433
|
+
|
424
434
|
loop do
|
425
435
|
loop do
|
426
436
|
foo = a.find_max(para, eb, opt: opt_a)
|
427
437
|
break if sca == foo
|
428
|
-
|
438
|
+
bar = opt_a.irep.para_call(para, *foo)
|
439
|
+
break if pa < bar
|
440
|
+
sca, pa = foo, bar
|
429
441
|
scb = b.search(para, pa, opt: opt_b)
|
430
442
|
foo = Mgmg.exp(*scb)
|
431
443
|
break if eb == foo
|
data/lib/mgmg/version.rb
CHANGED
data/lib/mgmg.rb
CHANGED
@@ -89,6 +89,8 @@ class String
|
|
89
89
|
pd = self.poly(:phydef, opt:)
|
90
90
|
md = self.poly(:magmag, opt:)
|
91
91
|
pd <= md ? pd : md
|
92
|
+
when :hs
|
93
|
+
self.poly(:hp, opt:) + self.poly(:str, opt:)
|
92
94
|
when :cost
|
93
95
|
if opt.include_system_equips and Mgmg::SystemEquip.has_key?(self) then
|
94
96
|
return Mgmg::TPolynomial.new(Mgmg::Mat.new(1, 1, 0.quo(1)), 28, 0, 12, 12)
|
@@ -140,7 +142,13 @@ class String
|
|
140
142
|
end
|
141
143
|
module Enumerable
|
142
144
|
using Mgmg::Refiner
|
143
|
-
def to_recipe(para=:power, **kw)
|
145
|
+
def to_recipe(para=:power, allow_over20: false, **kw)
|
146
|
+
unless allow_over20
|
147
|
+
self.each do |e|
|
148
|
+
foo = e.build(-1).star
|
149
|
+
raise Mgmg::Over20Error, foo if 20 < foo
|
150
|
+
end
|
151
|
+
end
|
144
152
|
Mgmg::Recipe.new(self, para, **kw)
|
145
153
|
end
|
146
154
|
def build(smith=-1, armor=smith, comp=armor.tap{armor=smith}, opt: Mgmg::Option.new)
|
data/reference.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# リファレンス
|
2
2
|
本ライブラリで定義される主要なメソッドを以下に解説します.
|
3
3
|
|
4
|
-
## `String#to_recipe(para=:power, allow_over20: false, **kw)`,`Enumerable#to_recipe(para=:power, **kw)`
|
4
|
+
## `String#to_recipe(para=:power, allow_over20: false, **kw)`,`Enumerable#to_recipe(para=:power, allow_over20: false, **kw)`
|
5
5
|
レシピ文字列である`self`と,注目パラメータ`para`,オプション`Mgmg.option(**kw)`をセットにした[後述](#mgmgrecipe)の`Mgmg::Recipe`オブジェクトを生成して返します.デフォルト値としてセットされたパラメータを使用する以外は,レシピ文字列と同様に扱えます.
|
6
6
|
|
7
7
|
`allow_over20`が偽の場合,レシピの☆を確認し,20を超える場合は,例外`Mgmg::Over20Error`を発生します.このチェックを抑制したい場合は,真にしてください.
|
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.6.
|
4
|
+
version: 1.6.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- KAZOON
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-10-
|
11
|
+
date: 2022-10-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|