mgmg 1.4.0 → 1.4.1

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: 7d4bcd6c24784e7e3935e56141851a1581dc7027b998e8ddf05197e647a57bbe
4
- data.tar.gz: d7d03752ecfb2478aee13ff6d7376e8db979f7df7202c58cf809763c0b548c0b
3
+ metadata.gz: fa07550bf3367d160e4915d65e592b2295667cfb56284543f8cf43c2a92c375d
4
+ data.tar.gz: 062c07e9c53d9b4ffb20332b7f9365727cbad46e93d83be49d4592ec4cae8a17
5
5
  SHA512:
6
- metadata.gz: 7558ce118474996b673ea56a04f28d5e36950a272c19d3ad14da2367599c725a58988c215e9c666df7ec9e954ae4106885afa639ccb2477f29e75990957375cb
7
- data.tar.gz: da3be7de946113103e0d05631a536d7b9ac0022cdd76b4e42a228b3a603a4d737b93bbc1a3cfc685125e9bd4bc3cd27e0d2d4940a72d327975876b9a3c99b9b7
6
+ metadata.gz: 1272f84d6fb42b63dc4c6e2180552f16311a9f8d65b392a2b0628e882ac7e6854d65a13e3f42549507c91bd2cdb190b1c295c514a982c64f77678cd21017cd7e
7
+ data.tar.gz: 9792b236879eb2ffb01e2f25389647b235a4a2328a6a4446b8c2636b738a849ee047201c5998cbf2098799c686e0fc4bb9d803a0b52ddaa0866139e19aa9a0a1
data/CHANGELOG.md CHANGED
@@ -106,3 +106,12 @@
106
106
  - `Mgmg::TPolynomial#<=>`を追加.
107
107
  - `Enumerable#show`を追加.
108
108
  - `Mgmg::Equip#pmdef`で,`Mgmg::Equip#phydef`と`Mgmg::Equip#magmag`のうち,小さい方を返すようにし,`String#poly`の引数に`:pmdef`を受け付けるようにした.
109
+
110
+ ## 1.4.1 2022/01/06
111
+ - [リファレンス](./reference.md)を[README](./README.md)から分離独立させた.
112
+ - `Mgmg::IR`を追加.
113
+ - これを生成するための`String#ir`および`Enumerable#ir`を追加
114
+ - `String#search`および`Enumerable#search`において,内部的にこれを利用することで高速化.
115
+ - `Mgmg.#find_lowerbound`, `Mgmg.#find_upperbound`を追加.
116
+ - 魔法の威力に対応する`Mgmg::Equip#magic2`を追加.
117
+ - `String#min_levels`およびその関連メソッドにおいて,重量1以外を指定できるようにした.
data/README.md CHANGED
@@ -91,6 +91,8 @@ p [sc, Mgmg.exp(*sc)]
91
91
  #=> [[155, 376], 304969]
92
92
  ```
93
93
 
94
+ 各メソッドの詳しい説明等は[リファレンス](./reference.md)を参照されたい.
95
+
94
96
  ### 表記ゆれについて
95
97
  本ゲームでは,装備種別の名称に,下記の表のような表記ゆれが存在します.
96
98
 
@@ -106,241 +108,6 @@ p [sc, Mgmg.exp(*sc)]
106
108
 
107
109
  「正式な装備種別名」は「製作品ver1.22β37」が妥当であろうと考え,`Mgmg::Equip#to_s`などではこれを用いるようにしています.
108
110
 
109
- ## リファレンス
110
- 本ライブラリで定義される主要なメソッドを以下に解説します.
111
-
112
- ### `String#build(smith=-1, comp=smith, left_associative: true)`
113
- レシピ文字列である`self`を解釈し,鍛冶・防具製作Lvを`smith`,道具製作Lvを`comp`として鍛冶・防具製作及び武器・防具合成を行った結果を後述の`Mgmg::Equip`クラスのインスタンスとして生成し,返します.例えば,
114
- ```ruby
115
- '[杖(水玉10火玉5)+本(骨10鉄1)]+[本(水玉5綿2)+杖(骨10鉄1)]'.build(112, 176)
116
- ```
117
- のようにします.基本的に`[]`による合成順序の指定が必要ですが,不確定の場合,`left_associative`が真なら左結合,偽なら右結合として解釈します.
118
- ```ruby
119
- '法衣(綿10皮10)+歴戦の服'
120
- ```
121
- のように,既成品を含む合成レシピも解釈します.キャラクリ初期装備の劣悪な服,劣悪な小手以外のあらゆる装備を網羅しています.劣悪な服,劣悪な小手はキャラクリ以外での初期装備品として解釈します.`comp`を省略した場合,`smith`と同じ値として処理します.
122
-
123
- `self`が解釈不能な場合,例外が発生します.また,製作Lvや完成品の☆制限のチェックを行っていないほか,本ライブラリでは`武器+防具`や`防具+武器`の合成も可能になっています.街の鍛冶・防具製作・道具製作屋に任せた場合をシミュレートする場合は製作Lvを負の値(`-1`など,負であれば何でもよい)にします(製作Lv0相当の性能を計算し,消費エレメント量は委託仕様となります).
124
-
125
- ### `Enumerable#build(smith=-1, armor=smith, comp=armor.tap{armor=smith}, left_associative: true)`
126
- 複数のレシピ文字列からなる`self`の各要素を製作し,そのすべてを装備したときの`Mgmg::Equip`を返します.製作では`鍛冶Lv=smith`, `防具製作Lv=armor`, `道具製作Lv=comp`とします.1つしか指定しなければすべてそのLv,2つなら1つ目を`smith=armor`,2つ目を`comp`に,3つならそれぞれの値とします.`left_associative`はそのまま`String#build`に渡されます.製作Lvが負の場合,製作Lv0として計算した上で,消費エレメント量は街の製作屋に頼んだ場合の値を計算します.武器複数など,同時装備が不可能な場合でも,特にチェックはされません.
127
-
128
- ### `String#min_level(weight=1)`
129
- `self`を`weight`以下で作るための最低製作Lvを返します.`build`と異なり,合成や既成品は解釈できません.また,素材の☆による最低製作Lvとのmaxを返すため,街の鍛冶・防具製作屋に頼んだ場合の重量は`self.build.weight`で確認する必要があります.`weight`を省略した場合,重量1となる製作Lvを返します.
130
-
131
- ### `String#min_levels(left_associative: true)`
132
- 合成レシピの各鍛冶・防具製作品に対して,レシピ文字列をキー,重量1で作製するために必要な製作Lvを値とした`Hash`を返します.重量1以外は指定できません.
133
- 最大値は,`self.build.min_level`によって得られます.
134
-
135
- ### `Enumerable#min_levels(left_associative: true)`
136
- すべての要素`str`に対する`str.min_levels`をマージした`Hash`を返します.
137
-
138
- ### `Enumerable#min_level(left_associative: true)`
139
- `self.min_levels`から武器,防具それぞれに対する最大値を求め,`[必要最小鍛冶Lv, 必要最小防具製作Lv]`を返します.武器,防具の一方のみが含まれる場合,もう一方は`0`になります.
140
- `String#min_level`と異なり,重量1以外は指定できません.
141
-
142
- ### `String#min_comp(left_associative: true)`,`Enumerable#min_comp(left_associative: true)`
143
- レシピ通りに合成するのに必要な道具製作Lvを返します.ただし,全体が「[]」で囲われているか,非合成レシピの場合,代わりに`0`を返します.
144
-
145
- `Enumerable`の場合,すべての要素に対する最大値を返します.
146
-
147
- ### `String#min_smith(left_associative: true)`,`Enumerable#min_smith(left_associative: true)`
148
- レシピ通りに製作するのに必要な鍛冶・防具製作Lvを返します.製作物の重量については考慮せず,鍛冶・防具製作に必要な☆条件を満たすために必要な製作Lvを返します.
149
-
150
- `Enumerable`の場合,すべての要素に対し,武器,防具それぞれの最大値を求め,`[必要最小鍛冶Lv, 必要最小防具製作Lv]`を返します.
151
-
152
- ### `String#poly(para=:cost, left_associative: true)`
153
- レシピ文字列である`self`を解釈し,`para`で指定した9パラ値について,丸めを無視した鍛冶・防具製作Lvと道具製作Lvの2変数からなる多項式関数を示す`Mgmg::TPolynomial`クラスのインスタンスを生成し,返します.`para`は次のシンボルのいずれかを指定します.
154
- ```ruby
155
- :attack, :phydef, :magdef, :hp, :mp, :str, :dex, :speed, :magic
156
- ```
157
- これらは,`Mgmg::Equip`から当該属性値を取得するためのメソッド名と同一です.`left_associative`は`String#build`の場合と同様です.
158
-
159
- `para`として,複数の9パラ値を組み合わせた以下のシンボルを指定することもできます.
160
- ```ruby
161
- :atkstr, :atk_sd, :dex_as, :mag_das, :magmag, :pmdef
162
- ```
163
- ただし,自動選択の`:power`は指定できません.
164
-
165
- また,`:cost`を渡すことで,消費エレメント量に関する近似多項式を得られます.`self`に`"+"`が含まれていれば合成品とみなし,最後の合成に必要な地エレメント量を,それ以外では,武器なら消費火エレメント量を,防具なら消費水エレメント量を返します.ただし,`self`が既成品そのものの場合,零多項式を返します.
166
-
167
- ### `String#smith_seach(para, target, comp, smith_min=nil, smith_max=10000, left_associative: true, cut_exp: Float::INFINITY, min_smith: false)`
168
- `para`の値が`target`以上となるのに必要な最小の鍛冶・防具製作Lvを二分探索で探索して返します.
169
- 道具製作Lvは`comp`で固定,鍛冶・防具製作Lvを`smith_min`と`smith_max`で挟み込んで探索します.
170
- `smith_min`が`nil`のとき,`min_smith`が真なら重量を問わず☆的に必要な最小の鍛冶・防具製作Lv (`self.min_smith`),偽なら最小重量で製作するのに必要な鍛冶・防具製作Lv (`self.build.min_level`)を使用します.
171
- `smith_min<smith_max`でないとき,`smith_max`で`para`が`target`以上でないときは`ArgumentError`となります.
172
- `para`は,`Mgmg::Equip`のメソッド名をシンボルで指定(`:power, :fpower`も可)します.
173
- 反転などの影響で,探索範囲において`para`の値が(広義)単調増加になっていない場合,正しい結果を返しません.
174
- `cut_exp`以下の経験値で`target`以上を達成できない場合,`Mgmg::SearchCutException`を発生します.
175
-
176
- ### `String#comp_search(para, target, smith, comp_min=nil, comp_max=10000, left_associative: true)`
177
- `String#smith_seach`とは逆に,鍛冶・防具製作Lvを固定して最小の道具製作Lvを探索します.
178
- `comp_min`が`nil`のときは,製作に必要な最小の道具製作Lv (`self.min_comp`)を使用します.
179
- その他は`String#smith_seach`と同様です.
180
-
181
- ### `String#search(para, target, smith_min=nil, comp_min=nil, smith_max=10000, comp_max=10000, left_associative: true, step: 1, cut_exp: Float::INFINITY, min_smith: false)`
182
- `c_min=comp_search(para, target, smith_max, comp_min, comp_max)` から `c_max=comp_search(para, target, smith_max, comp_min, comp_max)` まで,`step`ずつ動かして,
183
- `smith_search`を行い,その過程で得られた最小経験値の鍛冶・防具製作Lvと道具製作Lvからなる配列を返します.
184
- レシピ中の,対象パラメータの種別値がすべて奇数,または全て偶数であるなら,`step`を`2`にしても探索すべき範囲を網羅できます.
185
- `cut_exp`以下の経験値で`target`以上を達成できない場合,`Mgmg::SearchCutException`を発生します.
186
-
187
- ### `Enumerable#search(para, target, smith_min=nil, armor_min=nil, comp_min=nil, smith_max=10000, armor_max=10000, comp_max=10000, left_associative: true, cut_exp: Float::INFINITY, min_smith: false)`
188
- 複数装備の組について,`para`の値が`target`以上となる最小経験値の`[鍛冶Lv,防具製作Lv,道具製作Lv]`を返します.
189
- 武器のみなら防具製作Lvは`0`,防具のみなら鍛冶Lvは`0`,合成なしなら道具製作Lvは`0`となります.
190
- `cut_exp`以下の経験値で`target`以上を達成できない場合,`Mgmg::SearchCutException`を発生します.
191
-
192
- ### `String#eff(para, smith, comp=smith, left_associative: true)`
193
- [`smith`を1上げたときの`para`値/(`smith`を1上げるのに必要な経験値), `comp`を1上げたときの`para`値/(`comp`を2上げるのに必要な経験値)]を返します.
194
- `para`は,`Mgmg::Equip`のメソッド名をシンボルで指定(`:power, :fpower`も可)します.
195
-
196
- ### `String#peff(para, smith, comp=smith, left_associative: true)`
197
- 近似多項式における偏微分値を使用した場合の,`String#eff`と同様の値を返します.`self.poly(para, left_associative: left_associative).eff(smith, comp)`と等価です.
198
-
199
- ### `String#phydef_optimize(smith=nil, comp=smith, left_associative: true, magdef_maximize: true)`
200
- 反転物防装備の反転材の種別,素材の最適化を行い,修正したレシピを返します.
201
- `smith`,`comp`は探索を行う製作レベルを表し,`smith`が`nil`の場合,近似多項式で最適化を行います.近似多項式では,道具製作レベルの次数が高い項の係数を最適化します.
202
- 物防を最大化するレシピのうち,`magdef_maximize`が真なら魔防を最大化する組み合わせ,偽ならコストを最小化(≒魔防を最小化)する組み合わせを探索します.
203
- ある範囲での全数探索を行うため,段数の多いレシピでは計算量が膨大になるほか,厳密な最適化を保証するものではなく,今後のアップデートで解が変わるような変更が入る可能性があります.
204
-
205
- ### `String#buster_optimize(smith=nil, comp=smith, left_associative: true)`
206
- `String#phydef_optimize`の魔力弓版で,反転材の素材の最適化を行い,修正したレシピを返します.
207
-
208
- ### `Mgmg::Equip`
209
- 前述の`String#build`によって生成される装備品のクラスです.複数装備の合計値を表す「複数装備」という種別の装備品の場合もあります.以下のようなインスタンスメソッドが定義されています.
210
-
211
- ### `Mgmg::Equip#to_s`
212
- ```ruby
213
- "杖4☆20(骨綿)[攻撃:119, MP:104, 魔力:1,859, EL:水2]"
214
- ```
215
- のような,わかりやすい形式の文字列に変換します.上の例で「4」は重量,「骨」は主材質,「綿」は副材質を表します.各種数値が必要な場合は次以降に説明するメソッドをご利用ください.複数装備の場合は以下のような文字列になります.
216
- ```ruby
217
- "複数装備9(武:1, 頭:1, 飾:2)[攻撃:15, 物防:34, 魔防:28, HP:241, MP:71, 器用:223, 素早:222, 魔力:6,604]"
218
- ```
219
- 「9」は合計重量,(武:1, 頭:1, 飾:2)は武器を1つ,頭防具を1つ,装飾品を2つ装備していることを示します.装備している場合は「胴」「腕」「足」も記述されます.
220
-
221
- ### `Mgmg::Equip#inspect`
222
- `Mgmg::Equip#to_s`の出力に加え,0となる9パラ値を省略せず,総消費エレメント量を連結した文字列を出力します.すなわち,
223
- ```ruby
224
- "杖4☆20(骨綿)[攻撃:119, 物防:0, 魔防:0, HP:0, MP:104, 腕力:0, 器用:0, 素早:0, 魔力:1859, EL:火0地0水2]<コスト:火2066地1575水0>"
225
- ```
226
- のような文字列を返します.
227
-
228
- ### `Mgmg::Equip#weight, star`
229
- それぞれ重量,☆数を整数値で返します.「複数装備」の場合,`weight`は総重量,`star`は装備数に関する値が返ります.
230
-
231
- ### `Mgmg::Equip#total_cost`
232
- 製作に必要な総エレメント量を,火,地,水の順のベクトルとして返します.ケージの十分性の確認には,下記の`comp_cost`を用います.
233
-
234
- ### `Mgmg::Equip#comp_cost(outsourcing=false)`
235
- `self`が合成によって作られたものだとした場合の消費地エレメント量を返します.地ケージ確保のための確認用途が多いと思うので短い`cost`をエイリアスとしています.`outsourcing`が真の場合,街の道具製作屋に頼んだ場合のコストを返します.
236
- 武器なら火エレメント,防具なら水エレメントを,地エレメントと同値分だけ消費するため,火または水ケージも同量必要となります.
237
-
238
- ### `Mgmg::Equip#smith_cost(outsourcing=false)`
239
- `self`が鍛冶・防具製作によって作られたものだったものだとした場合の消費火・水エレメント量を返します.`outscourcing`が真の場合,街の鍛冶屋・防具製作屋に頼んだ場合のコストを返します.
240
-
241
- ### `Mgmg::Equip#attack, phydef, magdef, hp, mp, str, dex, speed, magic, fire, earth, water`
242
- それぞれ
243
- ```
244
- 攻撃,物防,魔防,HP,MP,腕力,器用,素早さ,魔力,火EL,地EL,水EL
245
- ```
246
- の値を`Integer`で返します.
247
-
248
- ### `Mgmg::Equip#power`
249
- 武器種別ごとに適した威力計算値を返します.具体的には以下の値です.
250
-
251
- |武器種別|威力計算値|
252
- |:-|:-|
253
- |短剣,双短剣|攻撃+腕力/2+器用/2|
254
- |剣,斧|攻撃+腕力|
255
- |弓|max(器用+攻撃/2+腕力/2, 魔力+器用/2+攻撃/4+腕力/4)|
256
- |弩|器用+攻撃/2+腕力/2|
257
- |杖,本|max(魔力x2,攻撃+腕力)|
258
-
259
- 弓,杖,本では`self`の性能から用途を判別し,高威力となるものの値を返します.防具に対してこのメソッドを呼び出すと,9パラメータのうち最も高い値を返します.
260
-
261
- 防具の場合,9パラメータのうち,最大のものを返します.ただし,最大の値に魔防が含まれている場合,代わりに「魔防+魔力/2」を返します.
262
-
263
- 複数装備の場合,9パラメータの合計値を返します.ただし,HPとMPは1/4倍します.HPとMPの特例は,消費エレメント量の計算と同様とするものです.
264
-
265
- いずれの場合も,EL値,重量,☆は無視されます.
266
-
267
- ### `Mgmg::Equip#atkstr, atk_sd, dex_as, mag_das`
268
- それぞれ
269
- ```
270
- 攻撃+腕力,攻撃+腕力/2+器用/2,器用+攻撃/2+腕力/2,魔力+器用/2+攻撃/4+腕力/4
271
- ```
272
- の値を返します.これらはそれぞれ
273
- ```
274
- (剣,斧,杖,本),(短剣,双短剣),(弓,弩),(バスターアロー)
275
- ```
276
- の威力です.トリックプレーやディバイドには対応していません.
277
-
278
- ### `Mgmg::Equip#magmag`
279
- 「魔防+魔力/2」の値を返します.魔力の半分が魔防に加算されることから,実際の魔防性能となります.
280
-
281
- ### `Mgmg::Equip#pmdef`
282
- 物防と実効魔防のうち,小さい方を返します.
283
-
284
- ### `Mgmg::Equip#+(other)`
285
- `self`と`other`を装備した「複数装備」の`Mgmg::Equip`を返します.`self`と`other`はいずれも単品でも「複数装備」でも構いません.武器複数などの装備可否チェックはされません.
286
-
287
- ### `Mgmg::Equip#history`
288
- 多段階の合成におけるすべての中間生成物からなる配列を返します.
289
- 「複数装備」の場合,各装備の`history`を連結した配列を返します.
290
-
291
- ### `Mgmg::Equip#min_levels`
292
- レシピ中の,鍛冶・防具製作物の文字列をキー,重量1で生成するのに必要な最小レベルを値とした`Hash`を返します.
293
- 「複数装備」の場合,各装備の`min_levels`をマージした`Hash`を返します.
294
-
295
- ### `Mgmg::Equip#min_level`
296
- `min_levels`の値の最大値を返します.「複数装備」の場合,`[鍛冶の必要レベル,防具製作の必要レベル]`を返します.
297
-
298
- ### `Mgmg::TPolynomial`
299
- 前述の`String#poly`によって生成される二変数多項式のクラスです.最初のTはtwo-variableのTです.以下のようなメソッドが定義されています.
300
-
301
- ### `Mgmg::TPolynomial#to_s(fmt=nil)`
302
- 鍛冶・防具製作LvをS,道具製作LvをCとして,`self`を表す数式文字列を返します.係数`coeff`を文字列に変換する際,`fmt`の値に応じて次の方法を用います.
303
-
304
- |`fmt`のクラス|変換法|
305
- |:-|:-|
306
- |`NilClass`|`coeff.to_s`|
307
- |`String`|`fmt % [coeff]`|
308
- |`Symbol`|`coeff.__send__(fmt)`|
309
- |`Proc`|`fmt.call(coeff)`|
310
-
311
- 通常,係数は`Rational`であるため,`'%.2e'`などを指定するのがオススメです.
312
-
313
- ### `Mgmg::TPolynomial#inspect(fmt=->(r){"Rational(#{r.numerator}, #{r.denominator})"})`
314
- `Mgmg::TPolynomial#to_s`と同様ですが,鍛冶・防具製作Lvを`s`,道具製作Lvを`c`としたRubyの式として解釈可能な文字列を返します.つまり,係数をリテラル,掛け算を`*`で表現しています.`fmt`は`Mgmg::TPolynomial#to_s`と同様で,適当な値を指定することでRuby以外の言語でも解釈可能になります.例えば,精度が問題でないならば,`'%e'`とすると,大抵の言語で解釈可能な文字列を生成できます.
315
-
316
- ### `Mgmg::TPolynomial#leading(fmt=nil)`
317
- 最高次係数を返します.`fmt`が`nil`なら数値(`Rational`)をそのまま,それ以外なら`Mgmg::TPolynomial#to_s`と同様の方式で文字列に変換して返します.ただし,レシピの段数に応じた最高次数を返すため,レシピ次第では本メソッドの返り値が`0`となり,それより低い次数の項が最高次となることもあり得ます.そのようなケースでの真の最高次の探索はしません.
318
-
319
- ### `Mgmg::TPolynomial#[](i, j)`
320
- 鍛冶・防具製作Lvをs,道具製作Lvをcとして,s<sup>i</sup>c<sup>j</sup> の係数を返します.負の値を指定すると,最高次から降順に数えた次数の項の係数を返します.例えば`i, j = -1, -1`なら,最高次の係数となります.引数が正で範囲外なら`0`を返し,負で範囲外なら`IndexError`を上げます.
321
-
322
- ### `Mgmg::TPolynomial#evaluate(smith, comp=smith)`
323
- 鍛冶・防具製作Lvを`smith`,道具製作Lvを`comp`として値を計算します.丸めを無視しているため,実際の合成結果以上の値が返ります.
324
-
325
- ### `Mgmg::TPolynomial#smith_fix(smith, fmt=nil)`
326
- 鍛冶・防具製作Lvを`smith`で固定し,道具製作Lvのみを変数とする多項式として,`to_s(fmt)`したような文字列を返します.
327
-
328
- ### `Mgmg::TPolynomial#scalar(value)`
329
- 多項式として`value`倍した式を返します.
330
- alias として`*`があるほか`scalar(1.quo(value))`として`quo`,`/`,`scalar(1)`として`+@`,`scalar(-1)`として`-@`が定義されています.
331
-
332
- ### `Mgmg::TPolynomial#+(other)`, `Mgmg::TPolynomial#-(other)`
333
- 多項式として`self+other`または`self-other`を計算し,結果を返します.
334
- `other`は`Mgmg::TPolynomial`であることが想定されており,スカラー値は使えません.
335
-
336
- ### `Mgmg::TPolynomial#partial_derivative(variable)`
337
- 多項式として偏微分し,その微分係数を返します.
338
- `variable`はどの変数で偏微分するかを指定するもので,`"s"`なら鍛冶・防具製作Lv,`"c"`なら道具製作Lvで偏微分します.
339
-
340
- ### `Mgmg::TPolynomial#eff(smith, comp=smith)`
341
- 製作Lv(`smith`, `comp`)における鍛冶・防具製作Lv効率と道具製作Lv効率からなる配列を返します.
342
- 一方のみが欲しい場合,`Mgmg::TPolynomial#smith_eff(smith, comp=smith)`,`Mgmg::TPolynomial#smith_eff(smith, comp=smith)`が使えます.
343
-
344
111
  ## 謝辞
345
112
  面白いゲームを作ってくださった耕様および,高精度なシミュレータを作製し,本ライブラリの作製を可能とした,Excel版装備計算機の作者様に感謝いたします.
346
113
 
data/lib/mgmg/equip.rb CHANGED
@@ -9,7 +9,7 @@ module Mgmg
9
9
  @total_cost = Vec[0, 0, 0]
10
10
  @history, @min_levels = [self], Hash.new
11
11
  end
12
- attr_accessor :kind, :weight, :star, :main, :sub, :para, :element, :total_cost, :history, :min_levels
12
+ attr_accessor :kind, :weight, :star, :main, :sub, :para, :element, :total_cost, :history
13
13
  def initialize_copy(other)
14
14
  @kind = other.kind
15
15
  @weight = other.weight
@@ -52,10 +52,19 @@ module Mgmg
52
52
  end
53
53
  end
54
54
 
55
- def min_level
55
+ def min_levels(w=1)
56
+ if w == 1
57
+ @min_levels
58
+ else
59
+ @min_levels.map do |key, value|
60
+ [key, key.min_level(w)]
61
+ end.to_h
62
+ end
63
+ end
64
+ def min_level(w=1)
56
65
  if @kind == 28
57
66
  ret = [0, 0]
58
- @min_levels.each do |str, ml|
67
+ min_levels(w).each do |str, ml|
59
68
  if str.build(-1).kind < 8
60
69
  if ret[0] < ml
61
70
  ret[0] = ml
@@ -68,7 +77,7 @@ module Mgmg
68
77
  end
69
78
  ret
70
79
  else
71
- @min_levels.values.append(0).max
80
+ min_levels(w).values.append(0).max
72
81
  end
73
82
  end
74
83
 
@@ -91,6 +100,9 @@ module Mgmg
91
100
  def mag_das
92
101
  magic()+dex_as().quo(2)
93
102
  end
103
+ def magic2
104
+ magic()*2
105
+ end
94
106
  [:fire, :earth, :water].each.with_index do |s, i|
95
107
  define_method(s){ @element[i] }
96
108
  end
@@ -272,8 +284,8 @@ module Mgmg
272
284
  unless kind
273
285
  raise InvalidEquipClassError.new(m[1])
274
286
  end
275
- main_m, main_s, main_mc = parse_material(m[2])
276
- sub_m, sub_s, sub_mc = parse_material(m[3])
287
+ main_m, main_s, main_mc = Mgmg.parse_material(m[2])
288
+ sub_m, sub_s, sub_mc = Mgmg.parse_material(m[3])
277
289
  para = Vec.new(9, 0)
278
290
  ele = Vec.new(3, 0)
279
291
 
@@ -303,23 +315,14 @@ module Mgmg
303
315
  raise InvalidSmithError.new(str)
304
316
  end
305
317
  kind = EquipIndex[m[1].to_sym]
306
- main_m, main_s, = parse_material(m[2])
307
- sub_m, sub_s, = parse_material(m[3])
318
+ main_m, main_s, = Mgmg.parse_material(m[2])
319
+ sub_m, sub_s, = Mgmg.parse_material(m[3])
308
320
 
309
321
  q, r = ((weight+1)*10000).divmod(MainWeight[main_m])
310
322
  l = ( EquipWeight[kind] + SubWeight[sub_m] - q + ( r==0 ? 1 : 0 ) )*2
311
323
  [(main_s-1)*3, (sub_s-1)*3, l].max
312
324
  end
313
325
 
314
- private def parse_material(str)
315
- m = /\A.+?(\d+)\Z/.match(str)
316
- mat = MaterialIndex[str.to_sym]
317
- if m.nil? || mat.nil?
318
- raise InvalidMaterialError.new(str)
319
- end
320
- [mat, m[1].to_i, mat<90 ? mat.div(10) : 9]
321
- end
322
-
323
326
  def min_comp(str, left_associative: true)
324
327
  str = Mgmg.check_string(str)
325
328
  stack, str = minc_sub0([], str)
@@ -384,8 +387,8 @@ module Mgmg
384
387
  unless kind
385
388
  raise InvalidEquipClassError.new(m[1])
386
389
  end
387
- main_m, main_s, main_mc = parse_material(m[2])
388
- sub_m, sub_s, sub_mc = parse_material(m[3])
390
+ main_m, main_s, main_mc = Mgmg.parse_material(m[2])
391
+ sub_m, sub_s, sub_mc = Mgmg.parse_material(m[3])
389
392
  [main_s, sub_s].max
390
393
  end
391
394
  end