【女神転生imagine】もち式装備シミュレータの実行終了より宇宙の終わりの方が早い
1秒間に1,000万件処理出来ても、実行終了までに3,000,000,000,000,000兆年かかるシミュレータに価値はあるのか。
「俺は好きだったよ」なMMOROG
6月14日にsteamで配信されたペルソナ4Gやってると「当時は色々なメガテンに手を出していたなあ」と、女神転生imagineという現在はサービス終了済みのオンラインゲームをやっていたのを懐かしむようになりました。
まあゲームの出来自体は、「俺は好きだったよ」なゲームでしたが約9年間も続いただけ大奮闘なMMORPGではなかったかと思っています。
そして話は脱線しますが、そろそろお仕事で「TypeScript」と「Deno」を学ぶ必要がありそうでして。
(Denoの公式イメージ画像がかわいいね)
しかし自分はTypeScriptどころかJavaScriptにもあまり触れないまま仕事をしてきてまして、ついでに言えば「Deno」どころか前身の「Node.js」に至っては一切合切知らないわけで。
とりあえず言語仕様よりも「JavaScript」と「Node.js」の空気感を知っておきたい。
なんかサーバーサイドの処理も必要そうでやりたい処理ないかなー。と考えて思いつきました。
webでも出来るモンハンの装備シミュレータ(https://mhw.wiki-db.com/sim/)。
これならまだ処理はイメージつきやすいですし、女神転生imagineを遊んでいた時は装備個数が多すぎて何を装備すればいいのか思いつかなくて困ってたので、当時の混乱に対する回答になって楽しそうです。
ついでに作っておけば他のゲームに嵌った時も流用できるのではないかと。
そんな思惑の元、女神転生imagine版の装備シミュレータ作成に手を出したのでした。
この時はまさか数日間管巻くことになるとは思ってませんでしたが。
必要処理時間は3,000,000,000,000,000兆年
まずは女神転生imagineの装備仕様を確認しましょう。
まずPCの装備箇所は15箇所あります。ただし、そのうち一つは銃器装備時のみに効果がある弾丸なので実質の装備箇所は14箇所。
そして各装備毎に3種の効果欄(外見性能・基本性能・特性)があり、この効果欄は異なる装備の効果欄を組み合わせられます。
(武器Aの外見性能で武器Bの基本特性と武器Cの特性を併せ持つ武器が作れます)
なので実態に即した装備箇所は14箇所×3種=42箇所。
実態に即した装備箇所は42箇所?
いや、多すぎないか?
なんかやべーものに手を出している気がしてきましたが、このまま続行。
とりあえず構想したスキルシミュレータの処理は以下の通り。
【もち式シミュレータ 初版】
- 利用者は獲得したい装備効果とその値を指定する
- シミュレータは関連する装備効果の有無で装備DBをフィルタリング
- シミュレータはフィルタリングされた装備の組み合わせを総当たり
- シミュレータは総当たり結果に各装備の値を加算する
- シミュレータは加算結果のうち、最初に指定した値を超えているものだけ表示
つまりやることは全装備探索。これから漏れなく出来て完璧だ。
このくらい処理の仕組みが簡単ならすぐに作れそうですね。
さあ、どのくらい処理に時間がかかると簡単に考えてみよう。
9年間やってただけあって装備と関連する効果も多い。各装備箇所に10個の装備候補があると仮定します。
そして前述の通り、実態に即した装備箇所は42箇所。
つまり総当たり結果パターンは10の42乗必要になる。
10の42乗?
10の42乗ってどのくらい数字大きいのよと検索してみたら以下のページが出てくる。
https://homepage45.net/unit/sub.htm
10の42乗=100正。
100兆よりゼロが30個多いらしい。クッキークリッカーかな。
例え1秒間に1,000万件処理出来ても、実行終了までに3,000,000,000,000,000兆年かかるシミュレータに価値はあるのか。ないだろう。
もっと効率のいいアルゴリズムを考える必要がありそうですね。
【もち式シミュレータ 2版】
やはりフィルタリングだけで総当たりは無謀だった。やはりスコア付けは必要だろう。
- 利用者は獲得したい装備効果とその値を指定する
- シミュレータは関連する装備効果の有無で装備DBをフィルタリング
- シミュレータはフィルタリングされた装備の効果値でスコアリング
- シミュレータは各装備箇所毎にスコアの高い順で最大5つまで選択
- シミュレータは選択された装備の組み合わせを総当たり
- シミュレータは総当たり結果のうち総スコアの高い順に各装備の値を加算する
- シミュレータは加算結果のうち、最初に指定した値を超えているものだけ表示
1つの装備箇所毎に候補数は最大5個までとしたので、これで総当たりパターンは大幅減少!
総当たりパターンは最大でも5の42乗!
つまり2.2×10の29乗!
2.2兆よりゼロが17個ほど多い!
ここまでやってもまだ宇宙の終わりの方が早いのか!
そもそも装備箇所が42箇所もある時点で総当たりで試行するのは大変厳しい。
例え各装備箇所の候補が2個ずつだとしても、2の42乗で4兆。
JavaScriptの配列の最大数が40億程度なので話にならない。
アプローチを全く別の方向に変える必要がありそう。
いろいろ考えてみたけれども、利用者が指定した効果を持つ装備を一覧表示して、その装備候補を着せ替えみたいに装備欄に入れ替えできるシミュレータにするかな。
無料でいい感じに使えるモックツールを知らないので適当に紙にあーでもない、こーでもないと考えてたけれども、装備欄が42個もあるおかげで視認性がありえんくらい辛そう。
だけどこれならプログラムでやることはデータベースから条件指定で装備を引っ張ってるくらい。計算も装備欄に嵌まっている装備の効果を加算するだけでよし。
例えば必殺発生+100の武器と必殺発生+50とダメージ軽減+20%の防具が装備欄にあれば、効果合計には必殺発生+150とダメージ軽減+20%が表示されるなど。
これならシステムの処理にかかる時間もそれほどではない。
着せ替えにする以上、以前シミュレートした装備と比較したり装備結果を保存したりも必要そうだけど、それはクッキーやテキスト出力も使って保存できるようにしよう。
システム名は「真・女神転生IMAGINE -装備検索プログラム-」
よし、これでいける。
紆余曲折は経ましたが、ようやく実現できそうなシミュレータになりました。
…さて、実現可能な段階に落とし込むだけで相当満足したので実際に作ることはない気がするな…。気が向いたら作ろう…。