【ポケモンMATLABダメ計】拡張機能リスト
本記事は以下リンクの補足として扱う。
以下内容を示す。
6.1 x16-Mode
→"乱1","乱2耐え"のとき,配列ごとに条件を満たす値を算出する機能
6.2 x16MaxDisp-mode
→x16-Modeで算出した値をUIに反映する機能
6.3 DamageLineDecision-Mode(DLD-Mode)
→"確1","確2耐え"などの基準を自動で決定する機能
6.4 x16Change-Mode
→ダメージ計算後,プロット変更時にx/16表示を最適化する機能
6.5 Exchange-Mode
→攻撃側ポケモンと防御側ポケモンのステータスなどを入れ替える機能
6.6 NewOpenVar-Mode(NOV-Mode)
→指定したH実数値,BD実数値の配列を呼び出す機能
6.7 MovePowerChange-Mode(MPC-Mode)
→わざ威力を入力変更する機能
6.8 MaximumHBD-Mode(MHBD-Mode)
→努力値252分をHとBDに配分し,耐久特性を明確化する機能。
6.9 1on1-Mode
→1入力1出力のダメージ計算機能
6.10 RunningTest-Mode(RT-Mode)
→多入力多出力の連続試験機能
6.11 DamageKeeping-Mode(DK-Mode)
→ダメージ計算の配列を一時保存し,次の計算結果に加算する機能
6.12 BoundaryCalculation-Mode(BC-Mode)
→耐久ラインを明確化し,努力値配分を最適化させる指標を表示する機能
6.13 ParameterSpecification-Mode(PS-Mode)
→一部パラメータを特定した状態でPS-Mode(通常フロー)による計算を行う
6.14 HequelBD-Mode(HeBD-Mode)
→耐久調整におけるH=B+Dを満たす条件を算出する機能
6. x1 あとがき
6. x2 更新履歴
また,各モードの突入可否を下表にまとめる。
※一部拡張モードへの遷移方法としてUI上のトグルボタンのON,OFFを使用しいたが,
拡張モードのON状態が重複してしまうことを考慮し,プルダウン形式に変更する。
”確2or乱1”乱数選択時にd(1.00)-d(0.85)の中に1.00以上のダメージがいくつあるか(x/16)を計算し,性格補正ごとのデータ配列の26列目にデータを格納する拡張機能である。格納されるデータは0-16の値となる。
【コード:x16pre-Mode】
下記コードにより,配列26列目にx/16のxにあたる整数を格納する。
【コード:x16-Mode】
26列目目がx以上の配列のみを抽出する
【変更点】
・x16Maxdisp-Modeをx16-Modeの前に移動
・
【MEMO】
・n.x16の初期値は"17"
・Opr.n.x16 = 18-Opr.n.dmg_x16_Xの計算はデータベース00のx/16の表示データに依存している
x16-Mode突入時にフラグが立っていれば,x16MaxDisp-modeに突入。
機能としてはx16-Modeで算出した結果をUIに反映する。
x16-Modeでデータ配列26列に格納した算出値からx/16 UIに反映する値を決定する。
【変更点】
・x16Maxdisp-Modeをx16-Modeの前に持ってくる
・if文の条件にデータ配列の26列目が存在するかを追加(論理値AND)
・突入条件は”ダメージ計算時”,もしくは,”ダメージライン変更時”とする。
→x16-Mode内にフラグONを行うと,強制的に表示を書き換えられる不具合あり
【MEMO】
・ダメージ計算時にはx16の最大値を表示するのみ。
→Figureに表示されるデータはダメージラインの最大数。
→x16選択すると,Figureの表示が変更。
・一周目だとわかる表示機能が必要。
・26列目のデータが存在するならば,x16-Mode内から外に出すことが可能
→ダメージ計算一周目からデータ表示数を制限できる
ダメージラインの条件を自動確定する拡張機能を実装する。条件式としては’x16MaxDisp-Modeで求めた計算値が空でない’,かつ,’ModeフラグON’の論理値とする。
DLD-Modeでは,”配列の各列ごとに条件に当てはまる行が最低1行存在すればよい”という考えのもと条件を絞り出す。
上図より,次の4領域の値をif文の条件の各閾値として設ける。
※修正
・1on1-Modeにて格納するダメージ配列は1行であるため,DLD-Modeにおける処理にバグが発生していることが判明
→本来は乱3耐えの判定だが,配列が1行しかないため,確3耐えのフローに入ってしまう
→DLD-Modeの確x耐えと乱x耐えの突入条件が逆となっていたため修正
条件の優先度,条件式は下表を基準とする。
また,if文のケース判別は(性格補正0.9の条件式 or 性格補正の1.0 条件式or 性格補正の1.1条件式)の論理値に依存させる。
上表の制約条件を数直線上に示すと下図となり,線消し部分の条件を省略しても,すべての領域を条件が満たすことが可能となる。
このとき,if文のフローをⅰ→ⅱ→ⅲ→ⅳ→ⅴの優先度で設定する。
【コード:DLD-Mode】
【変更点】
・ダメージライン条件を変更(5.4.2 ダメージライン処理参照)
・領域が重なる部分は省略
plot09-11を選択時に,x/16のUI表示をx16MaxDisp-Modeで算出した値に変更する。
以下内容を示す。
6. 拡張機能
基本機能に追加する各拡張機能について記述する。6.1 x16-Mode
→"乱1","乱2耐え"のとき,配列ごとに条件を満たす値を算出する機能
6.2 x16MaxDisp-mode
→x16-Modeで算出した値をUIに反映する機能
6.3 DamageLineDecision-Mode(DLD-Mode)
→"確1","確2耐え"などの基準を自動で決定する機能
6.4 x16Change-Mode
→ダメージ計算後,プロット変更時にx/16表示を最適化する機能
6.5 Exchange-Mode
→攻撃側ポケモンと防御側ポケモンのステータスなどを入れ替える機能
6.6 NewOpenVar-Mode(NOV-Mode)
→指定したH実数値,BD実数値の配列を呼び出す機能
6.7 MovePowerChange-Mode(MPC-Mode)
→わざ威力を入力変更する機能
6.8 MaximumHBD-Mode(MHBD-Mode)
→努力値252分をHとBDに配分し,耐久特性を明確化する機能。
6.9 1on1-Mode
→1入力1出力のダメージ計算機能
6.10 RunningTest-Mode(RT-Mode)
→多入力多出力の連続試験機能
6.11 DamageKeeping-Mode(DK-Mode)
→ダメージ計算の配列を一時保存し,次の計算結果に加算する機能
6.12 BoundaryCalculation-Mode(BC-Mode)
→耐久ラインを明確化し,努力値配分を最適化させる指標を表示する機能
6.13 ParameterSpecification-Mode(PS-Mode)
→一部パラメータを特定した状態でPS-Mode(通常フロー)による計算を行う
6.14 HequelBD-Mode(HeBD-Mode)
→耐久調整におけるH=B+Dを満たす条件を算出する機能
6. x1 あとがき
6. x2 更新履歴
また,各モードの突入可否を下表にまとめる。
拡張モードのON状態が重複してしまうことを考慮し,プルダウン形式に変更する。
6.1 x16-Mode
【コード:x16pre-Mode】
下記コードにより,配列26列目にx/16のxにあたる整数を格納する。
【コード:x16-Mode】
26列目目がx以上の配列のみを抽出する
・x16Maxdisp-Modeをx16-Modeの前に移動
・
【MEMO】
・n.x16の初期値は"17"
・Opr.n.x16 = 18-Opr.n.dmg_x16_Xの計算はデータベース00のx/16の表示データに依存している
6.2 x16MaxDisp-mode
x16-Modeでデータ配列26列に格納した算出値からx/16 UIに反映する値を決定する。
【変更点】
・x16Maxdisp-Modeをx16-Modeの前に持ってくる
・if文の条件にデータ配列の26列目が存在するかを追加(論理値AND)
・突入条件は”ダメージ計算時”,もしくは,”ダメージライン変更時”とする。
→x16-Mode内にフラグONを行うと,強制的に表示を書き換えられる不具合あり
【MEMO】
・26列目のデータが存在するならば,x16-Mode内から外に出すことが可能
→ダメージ計算一周目からデータ表示数を制限できる
6.3 DamageLineDecision-mode(DLD-Mode)
DLD-Modeでは,”配列の各列ごとに条件に当てはまる行が最低1行存在すればよい”という考えのもと条件を絞り出す。
上図より,次の4領域の値をif文の条件の各閾値として設ける。
・1on1-Modeにて格納するダメージ配列は1行であるため,DLD-Modeにおける処理にバグが発生していることが判明
→本来は乱3耐えの判定だが,配列が1行しかないため,確3耐えのフローに入ってしまう
→DLD-Modeの確x耐えと乱x耐えの突入条件が逆となっていたため修正
条件の優先度,条件式は下表を基準とする。
また,if文のケース判別は(性格補正0.9の条件式 or 性格補正の1.0 条件式or 性格補正の1.1条件式)の論理値に依存させる。
上表の制約条件を数直線上に示すと下図となり,線消し部分の条件を省略しても,すべての領域を条件が満たすことが可能となる。
このとき,if文のフローをⅰ→ⅱ→ⅲ→ⅳ→ⅴの優先度で設定する。
【コード:DLD-Mode】
【変更点】
・ダメージライン条件を変更(5.4.2 ダメージライン処理参照)
・領域が重なる部分は省略
6.4 x16Change-Mode
攻守交代機能を持ったプッシュボタンをUIに実装する。
設定した値(ポケモン,性格,Lv, 個体値,努力値,もちもの,状態,ランク)を交換する。func00と機能が酷似しているため,func00内にソースコードを書き,ModeフラグのON,OFFで切り替えを行う。
【コード:Exchange-Mode:データの一時記録】
【コード:Exchange-Mode:データの交換】
【コード:Exchange-Mode:UIへの反映】
OpenData機能は5.6節,もしくは事前に指定した性格補正のデータ配列を表示させる機能であり,拡張機能実装前は目的外のデータ配列が多く表示され識別しづらいことから,当機能に”特定のH実数値,BD実数値のデータ配列のみ抽出して表示”する拡張機能を追加。
UIにH実数値,BD実数値をEditにより入力するUIを実装。各数値を入力後,OpenDataのプッシュボタンUIを選択することにより,モード突入する。なお,ソースコードはfunc04内に記述する。
本拡張機能はH実数値記入EditUIにn.nov1,BD実数値記入EditUIにn.nov2のModeフラグをそれぞれ設定し,数値が記入された際に各フラグがONになる。
この2値を並べ,2進数変換(n.novbin)を行うことでMode突入後のデータ処理を判別する。詳細を下表に示す。
※表示するデータは5.5節で選択されている性格に依存する。
設定した値(ポケモン,性格,Lv, 個体値,努力値,もちもの,状態,ランク)を交換する。func00と機能が酷似しているため,func00内にソースコードを書き,ModeフラグのON,OFFで切り替えを行う。
【コード:Exchange-Mode:データの一時記録】
【コード:Exchange-Mode:データの交換】
【コード:Exchange-Mode:UIへの反映】
6.6 NewOpenVar-Mode(NOV-Mode)
UIにH実数値,BD実数値をEditにより入力するUIを実装。各数値を入力後,OpenDataのプッシュボタンUIを選択することにより,モード突入する。なお,ソースコードはfunc04内に記述する。
本拡張機能はH実数値記入EditUIにn.nov1,BD実数値記入EditUIにn.nov2のModeフラグをそれぞれ設定し,数値が記入された際に各フラグがONになる。
この2値を並べ,2進数変換(n.novbin)を行うことでMode突入後のデータ処理を判別する。詳細を下表に示す。
※性格を選ばずにOpenDataを行う場合,構造体の最上位ファイルが表示される。
わざの威力を任意に変更するモード。
(後に実装するはたきおとすやエラがみなどの威力変更を一時的に任意に変更する)
Editにより数値を直接入力し,計算に反映させる。パラメーター更新により数値をもとに戻すこと可能。
H-BDに努力値をどの配分で振れば,最大耐久指数が実現できるか確認するモード。
コンセプトはツイッターで以下投稿を見て真似てみたお話。
64行の努力値データを用意し,Simulinkにインプット,計算を行い配列データを入手する。(1列目,6列目は性格補正,ならびにBorDの6パターン存在する)
Simulink実装図を下に示す。
ツール上でのプロット表示は5.6節のAxis自動調整機能をベースとして作成する。
また,特定のH努力値,耐久指数を入力し,任意の配列を表示できる機能あり。(NOV-Modeを基盤とした機能)
上記のツイッター投稿を参考に,アーマーガア,グソクムシャ,クレベースの解析結果を算出すると以下のようになる。(縦軸耐久指数,横軸H努力値)
1.アーマーガア
B:MHBD解析(27161,H努0,B努252)
D:MHBD解析(23701,H努0,D努252)
2.グソクムシャ
B:MHBD解析(29241,H努164,B努88)
D:MHBD解析(21300,H努0,D努252)
3.クレベース
B:MHBD解析(41208,H努252,B努0)
D:MHBD解析(16660,H努0,D努252)
※表示時に最大耐久のH,B,Dの努力値を表示するように改良(検討中)
【コード:HMBD- mode】
※HeBD-ModeのようにH実数値×B実数値を出発式とした理論値導出をやってみた。
→計算が多すぎるのは詳細は省略しますが,とりま上に凸の二次関数になるということはわかりました。
【コンセプト】
本ツールの主目的と異なり,すべての努力値パターンの計算に対し,1パターンの努力値のみの計算を行う。(通常のダメージ計算)
1on1-Modeによりダメージ計算を行った際のUI画面を以下に示す。
1on1-Mode追加に伴い,コード追記した部分を以下に示す。
【コード:1on1- mode】
plotに関するコードを以下に示す。
【変更点】
・damage10_2をプロットデータとして扱っていたが,バグ取りのためdamage10に変更
→実際データ処理してあろうがなかろうが関係ない部分なのでこの処理でいいはず
・0.85と1.00のdamage/Hだけでなくdamageのテキストプロットがある方がわかりやすいと判断
【解決するべき課題】
・データの表示方法
・OpenData
・DamageKeeping-Modeの追加
【コンセプト】
ポケモンのダメージ計算時に各パラメータを毎度変更するのは手間がかかる
パターン分けを考慮すると計算量は多くなる
↓
1.予めポケモンの努力値配分,持ち物,ステータスなどをテーブルとして保存
2.1攻撃パターンから防御側テーブル or 1防御パターンから攻撃側テーブルへ
3.一度のシミュレーションで複数のパターンの計算を行う
4.ダメージの多い順にソートする。
イメージとしてはダメージ計算する際に
・ガブリアスいじっぱりA252のげきりん
・ガブリアスいじっぱりA252のげきりん+ハチマキ
・ガブリアスいじっぱりA252のげきりん+珠
・ガブリアスいじっぱりA252のげきりん+つるぎのまい
・ガブリアスいじっぱりA252のげきりん+珠+つるぎのまい
など性格をいじっぱり→ようきにするなど複数のパターンを毎回設定値を変更して計算するのがめんどくさいので,一度にできないかな?というもの
パラメータ設定の正確性が向上
オーソドックスな攻撃パターン,防御パターンをデータ化
テストしたい努力値パターンに入力し,あらゆるパターンを計算
ダメーイラインの明確化
【実装内容】
RT-Modeのフローを以下に示す。
用意するデータベースは以下のようにgoogleスプレッドシートを用いて作成する。
※DB作成時の注意
→Atサンプルについてはダイマックスありなし,ステロありなしの4パターンができる
コード追加部分を下記に示す。
【コード:RT- Mode】
いくつかの専用コードを以下に示す。
※for文による配列データの作成
※強制書き換え
RT-Mode起動の際に置換する構造体リストを以下に示す。
分類Atの場合:入力データが攻撃側,DBデータが防御側
分類Dfの場合:DBデータが攻撃側,入力データが防御側
【RT-Modeの出力結果】
上記RT-Modeにより,計算した結果の一例を示す。
ⅰ RunningTestAt-Modeの場合
ニンフィアのハイパーボイスを入力値とする。
出力として以下のような配列を得ることができる。
現時点で43パターンのポケモンを一度にダメージ計算することが可能である。
ⅱ RunningTestDf-Modeの場合
HB特化アーマーガアを入力値とする。
出力として以下のような配列を得ることができる。
現時点で331パターンのポケモンを一度にダメージ計算することが可能である
ⅰ,ⅱより,データベース作成を進めることで更に多くのサンプルを同時に計算することが可能となる。この機能により,想定外のパターンの計算や,新たな耐久調整先の指針を立たせることが可能となる。
【RT-Modeのデータベース作成指針について】
DBとして入力する情報テーブルの作成指針について,以下のようにまとめる。
※ランク補正などの場合分けを増やすと,計算後の判別が難しくなることがわかったため,最低限のデータ量に抑える必要あり
・Atの場合
※ミミッキュはばけのかわスリップありなし両方計算する
・Dfの場合
※ダイマックス技は最大火力がでるわざを考慮
【設計メモ】
・なるべくオリジナルの構文通りに拡張機能を実装する。
・構造体のOpr.の後にmrtをつける
→opr.mtr.para.poke_mrtなど
・わざ威力変更補正はS実数値を取得できていないため,RT-Modeでは後回し
→間に一度実数値を取得できる構文を作成する必要あり
→Opr.mrt.frag_zi = 1;のフラグを立て,その時のみ計算する
→手動入力によるわざ威力変更は通常フローではMPC-Modeで処理しえいるため,
RT-Modeでは別途処理を考慮したほうが良さげ
・For文を回すものによっては,AtとDfで更に場合分けする必要あり
・Zわざ,ダイマックスのfor文処理はDfのときのみ
・タイプ変更は検討中,,,
・強制変更
→ランク,天候,フィールド,急所,スリップA
→simulink上の起動フラグはopr.mrt,fragとする
・HBDの入力値を1on1仕様に変更する
・simulinkのブロック使用数に注意
・識別Codeについて
→配列の中に識別用のcodeを実装
0_111111_111111_なしなし
= ダイマックス_ランクDB_ランクinput_天候フィールド
=DB実数値_天候フィールド
・思ったより計算に時間がかからないので,どんどんデータベースの拡充はできそう
・2020の正月のほとんどをこの機能の開発に費やしたが,とてもとても充実した時間だった,,,いい意味で!
【課題】
・データベース入力時にデータを選択できるようにする
→世代ごと,ポケモンごと,物理。特殊など
・出力時にデータを選択できるようにする
【余談】
実は大学4年生位でGoogleスプレッドシートで一度作ってみたものの,オンラインのスプレッドシートのためデータの読み込みに時間がかる,マクロ等の機能をつけなかったためパラメータを少しでも変更するとすぐに計算に反映され,PCがあっっつくなるというデメリットがあったためそっと封印したのだが,今回あらためて実装してみようかなと思った次第です。
【コンセプト】
ダメージ計算した際の配列を一時保存して,次の計算結果に反映する。
ex.
マリルリのはらだいこたきのぼり+アクアジェット
メガガルーラのねこだまし+すてみタックル
ミミッキュのじゃれつく+かげうち
などメインわざ+先制技のダメージ計算を用意にする目的とする。
新たにソースコードfunc_06を設立する。
func_calDmg内に次コードを追加する。
2回目のダメージ計算に保存していたダメージを追加する。
【検証】
メガルカリオ(おくびょうC252,てきおうりょく)のラスターカノン+しんくうはをB4ガブリアスに対して1on1-Modeで入力する
1.ラスターカノンのダメージ計算を行い,DK-Modeで配列を保存する。
【設計メモ】
・通常フローおよび,1on1-Modeにて当機能が起動する
→RT-Modeは実装予定なし
・Exchange,Reset時に保留していた配列結果を破棄する
・Main_03においてわざ名をOpr.mdk.para.moveに引き継ぐ
・加算する配列は2-17,25,27-42列目とする(データ配列)
【コンセプト】
本作成ツールにおいて,"確1"や”確1耐え”の計算結果が出た際に,H-BDの耐久指数のラインが表示される。(以下図の右側に現れるプロットにななめのラインができている)
このときの斜めのラインの耐久指数を自動計算する拡張機能を実装する。(デフォルト)
記述コードの内容を以下に示す。
【コード:BC- Mode】
実装したコードを以下に示す。
【実装後の結果】
確1,2などの場合(At主観)
・A252メガルカリオのコメットパンチをキュレムへ通常フローでダメージ計算
・画像のプロット部分のH203,B136の赤点に0を確認できる
→確1で倒しきれる最大耐久ラインを確認できる
確1耐え,2耐えなどの場合(Df主観)
・A特化ボーマンダのすてみタックルをニンフィアへ通常フローでダメージ計算
・画像のプロット部分のH170,B123の赤点に0を確認できる
→確1耐えが可能な最小耐久ラインを確認できる
・同時に変数配列を表示する
【課題】
・性格補正ごとにデータソート可能にする。
・BC-Modeのopenvar機能を何らかの方法で実装
【設計メモ】
・ダメージライン決定コードと連動している部分あり
→変更時に留意
1.H実数値ごとのB or Dの値を抽出
→H実数値は性格補正の影響を受けない
→"確1"ならば最大B or D,"確1耐え"ならば最小B or D
2.その際の耐久指数を計算
3.なんらかの処理
→2-3サンプルごとに値をプロット
→平均値の表示
通常フローにおいては,H努力値0-252の64パターン,BorD努力値0-252の64パターン,性格補正3パターン,計12288パターンを一度に計算できるシステムを構築した。
しかしながら,実際のパラメータ設計においては以下の要素からある程度のパラメータが予め決定できることがわかる。
・耐久調整においては性格補正1.0 or 1.1に限定される
・耐久指数に余裕がある場合はH実数値を決定してから努力値配分が可能
・S調整を行ってから,他パラメータへと努力値を配分する
これらの条件から,性格補正を固定,かつすでに配分された努力値を除くパラメータを使用してダメージ計算を行うパラメータ指定モードを作成する。
※本機能はUIで配分した努力値合計が4より大きくないと効果を発揮しないことに留意
以下に拡張機能のフローを記述する。
コード追加内容を以下に示す。
【コード:PS- Mode】
実装したコードの一部を以下に示す。
また,PS-Mode実装部分のsimulinkブロック図を下図に示す。
【実装後の結果】
性格控えめ固定,S20振りのニンフィアがアーマーガアのダイスチル(A0,補正なし)を耐える努力値の組み合わせを算出する
ⅰH努力値指定なしの場合
HとBに残り努力値を最大488割いて,確1 耐え可能な組み合わせを導き出す。
ⅱ H努力値指定ありの場合(H実数値191になるように努力値164を降った場合)
H実数値191のときに上記条件を確1 耐えできる最小限のB努力値を算出する。
【設計メモ】
・防御側のBorDの判定が必要なためコードは,func_01ではなくMain_03のfunc_calBlockの後にif文で実装する
【コンセプト】
以下,ツイートを見ていつか実装してみたいと思った機能。
また,実数値計算式よりH=B+Dを満たす理論式を導き出し,簡易的にH=B+Dの条件を満たすか否かを判別可能にする。
・自由度のあるパラメータはH,B,D実数値の3値
・HBDに努力値最大合計508を割り振る
・性格補正は(B,D)=(1.0,1.0), (1.1,1.0), (1.0,1.1)の3パターン
もしくはUI入力時の性格補正に固定
※インプットする努力値パターンだけで312,000あるため,性格補正はUI入力値のものに限定する。
※努力値パターンは先にzerosなどで配列を準備しておくと,計算処理が早くなる
以下構文より入力する努力値パターンを作成する。
【コード:HeBD- Mode,入力配列作成部分】
simulinkモデルに入力する配列を以下に示す。
【コード:HeBD- Mode,入力配列作成部分2とsimulinkモデル起動部分】
また,HeBD-Mode実装部分のsimulinkブロック図を下図に示す。
※許容誤差の基準値は現在試験的に設定したものである
6.7 MovePowerChange-Mode(MPC-Mode)
(後に実装するはたきおとすやエラがみなどの威力変更を一時的に任意に変更する)
Editにより数値を直接入力し,計算に反映させる。パラメーター更新により数値をもとに戻すこと可能。
6.8 MaximumHBD-Mode( MHBD-Mode)
コンセプトはツイッターで以下投稿を見て真似てみたお話。
ツール立ち上げ時にダメージ計算結果プロット画面がからの状態だったので,この指標を載せることを決定。ツール立ち上げ時,もしくはパラメータアップデート時にダメージ計算結果を消去し,H-BDの配分結果を載せる。252で最大耐久を出す方法を考えるの巻 pic.twitter.com/MTCPAfcJoe— ざこやま (@zakoyama_poke) December 2, 2019
Simulink実装図を下に示す。
ツール上でのプロット表示は5.6節のAxis自動調整機能をベースとして作成する。
また,特定のH努力値,耐久指数を入力し,任意の配列を表示できる機能あり。(NOV-Modeを基盤とした機能)
上記のツイッター投稿を参考に,アーマーガア,グソクムシャ,クレベースの解析結果を算出すると以下のようになる。(縦軸耐久指数,横軸H努力値)
1.アーマーガア
B:MHBD解析(27161,H努0,B努252)
D:MHBD解析(23701,H努0,D努252)
2.グソクムシャ
B:MHBD解析(29241,H努164,B努88)
D:MHBD解析(21300,H努0,D努252)
3.クレベース
B:MHBD解析(41208,H努252,B努0)
D:MHBD解析(16660,H努0,D努252)
※表示時に最大耐久のH,B,Dの努力値を表示するように改良(検討中)
【コード:HMBD- mode】
※HeBD-ModeのようにH実数値×B実数値を出発式とした理論値導出をやってみた。
→計算が多すぎるのは詳細は省略しますが,とりま上に凸の二次関数になるということはわかりました。
6.9 1on1-Mode
本ツールの主目的と異なり,すべての努力値パターンの計算に対し,1パターンの努力値のみの計算を行う。(通常のダメージ計算)
1on1-Modeによりダメージ計算を行った際のUI画面を以下に示す。
1on1-Mode追加に伴い,コード追記した部分を以下に示す。
plotに関するコードを以下に示す。
【変更点】
・0.85と1.00のdamage/Hだけでなくdamageのテキストプロットがある方がわかりやすいと判断
【解決するべき課題】
・DamageKeeping-Modeの追加
6.10 RunningTest-Mode
ポケモンのダメージ計算時に各パラメータを毎度変更するのは手間がかかる
パターン分けを考慮すると計算量は多くなる
↓
1.予めポケモンの努力値配分,持ち物,ステータスなどをテーブルとして保存
2.1攻撃パターンから防御側テーブル or 1防御パターンから攻撃側テーブルへ
3.一度のシミュレーションで複数のパターンの計算を行う
4.ダメージの多い順にソートする。
イメージとしてはダメージ計算する際に
・ガブリアスいじっぱりA252のげきりん
・ガブリアスいじっぱりA252のげきりん+ハチマキ
・ガブリアスいじっぱりA252のげきりん+珠
・ガブリアスいじっぱりA252のげきりん+つるぎのまい
・ガブリアスいじっぱりA252のげきりん+珠+つるぎのまい
など性格をいじっぱり→ようきにするなど複数のパターンを毎回設定値を変更して計算するのがめんどくさいので,一度にできないかな?というもの
パラメータ設定の正確性が向上
オーソドックスな攻撃パターン,防御パターンをデータ化
テストしたい努力値パターンに入力し,あらゆるパターンを計算
ダメーイラインの明確化
【実装内容】
RT-Modeのフローを以下に示す。
用意するデータベースは以下のようにgoogleスプレッドシートを用いて作成する。
※DB作成時の注意
→Atサンプルについてはダイマックスありなし,ステロありなしの4パターンができる
コード追加部分を下記に示す。
いくつかの専用コードを以下に示す。
※for文による配列データの作成
※強制書き換え
RT-Mode起動の際に置換する構造体リストを以下に示す。
分類Atの場合:入力データが攻撃側,DBデータが防御側
分類Dfの場合:DBデータが攻撃側,入力データが防御側
【RT-Modeの出力結果】
上記RT-Modeにより,計算した結果の一例を示す。
ⅰ RunningTestAt-Modeの場合
ニンフィアのハイパーボイスを入力値とする。
出力として以下のような配列を得ることができる。
現時点で43パターンのポケモンを一度にダメージ計算することが可能である。
ⅱ RunningTestDf-Modeの場合
HB特化アーマーガアを入力値とする。
出力として以下のような配列を得ることができる。
ⅰ,ⅱより,データベース作成を進めることで更に多くのサンプルを同時に計算することが可能となる。この機能により,想定外のパターンの計算や,新たな耐久調整先の指針を立たせることが可能となる。
【RT-Modeのデータベース作成指針について】
DBとして入力する情報テーブルの作成指針について,以下のようにまとめる。
※ランク補正などの場合分けを増やすと,計算後の判別が難しくなることがわかったため,最低限のデータ量に抑える必要あり
・Atの場合
→かたやぶりも考慮
・Dfの場合
【設計メモ】
・なるべくオリジナルの構文通りに拡張機能を実装する。
・構造体のOpr.の後にmrtをつける
→opr.mtr.para.poke_mrtなど
・わざ威力変更補正はS実数値を取得できていないため,RT-Modeでは後回し
→間に一度実数値を取得できる構文を作成する必要あり
→Opr.mrt.frag_zi = 1;のフラグを立て,その時のみ計算する
→手動入力によるわざ威力変更は通常フローではMPC-Modeで処理しえいるため,
RT-Modeでは別途処理を考慮したほうが良さげ
・For文を回すものによっては,AtとDfで更に場合分けする必要あり
・Zわざ,ダイマックスのfor文処理はDfのときのみ
・タイプ変更は検討中,,,
・強制変更
→ランク,天候,フィールド,急所,スリップA
→simulink上の起動フラグはopr.mrt,fragとする
・HBDの入力値を1on1仕様に変更する
・simulinkのブロック使用数に注意
・識別Codeについて
→配列の中に識別用のcodeを実装
=DB実数値_天候フィールド
・思ったより計算に時間がかからないので,どんどんデータベースの拡充はできそう
・2020の正月のほとんどをこの機能の開発に費やしたが,とてもとても充実した時間だった,,,いい意味で!
【課題】
・データベース入力時にデータを選択できるようにする
→世代ごと,ポケモンごと,物理。特殊など
・出力時にデータを選択できるようにする
【余談】
実は大学4年生位でGoogleスプレッドシートで一度作ってみたものの,オンラインのスプレッドシートのためデータの読み込みに時間がかる,マクロ等の機能をつけなかったためパラメータを少しでも変更するとすぐに計算に反映され,PCがあっっつくなるというデメリットがあったためそっと封印したのだが,今回あらためて実装してみようかなと思った次第です。
6.11 DamageKeeping-Mode
ダメージ計算した際の配列を一時保存して,次の計算結果に反映する。
ex.
マリルリのはらだいこたきのぼり+アクアジェット
メガガルーラのねこだまし+すてみタックル
ミミッキュのじゃれつく+かげうち
などメインわざ+先制技のダメージ計算を用意にする目的とする。
新たにソースコードfunc_06を設立する。
func_calDmg内に次コードを追加する。
2回目のダメージ計算に保存していたダメージを追加する。
【検証】
メガルカリオ(おくびょうC252,てきおうりょく)のラスターカノン+しんくうはをB4ガブリアスに対して1on1-Modeで入力する
1.ラスターカノンのダメージ計算を行い,DK-Modeで配列を保存する。
2.わざをしんくうはに変更し,ダメージ計算を行う。
上記コードによって,計算ダメージに保存ダメージが加算される
当機能により,異なるわざを使用する場合のダメージ計算が容易となる。
【設計メモ】
・通常フローおよび,1on1-Modeにて当機能が起動する
→RT-Modeは実装予定なし
・Exchange,Reset時に保留していた配列結果を破棄する
・Main_03においてわざ名をOpr.mdk.para.moveに引き継ぐ
・加算する配列は2-17,25,27-42列目とする(データ配列)
6.12 BoundaryCalculation-Mode(BC-Mode)
本作成ツールにおいて,"確1"や”確1耐え”の計算結果が出た際に,H-BDの耐久指数のラインが表示される。(以下図の右側に現れるプロットにななめのラインができている)
このときの斜めのラインの耐久指数を自動計算する拡張機能を実装する。(デフォルト)
記述コードの内容を以下に示す。
【コード:BC- Mode】
実装したコードを以下に示す。
【実装後の結果】
確1,2などの場合(At主観)
・A252メガルカリオのコメットパンチをキュレムへ通常フローでダメージ計算
・画像のプロット部分のH203,B136の赤点に0を確認できる
→確1で倒しきれる最大耐久ラインを確認できる
・同時に変数配列を表示する
→1列目のH努力値0,B努力値252のラインまで確1に持っていけることがわかる
→裏を返せばキュレムはBに努力値を降ったほうが耐久が高いことがわかる
→これはMHBD-Modeにより算出する結果と同様の結果が得られる
確1耐え,2耐えなどの場合(Df主観)
・A特化ボーマンダのすてみタックルをニンフィアへ通常フローでダメージ計算
・画像のプロット部分のH170,B123の赤点に0を確認できる
→確1耐えが可能な最小耐久ラインを確認できる
→1列目のH努力値0,B努力値212のラインで確1耐えを実現することができる
【課題】
・BC-Modeのopenvar機能を何らかの方法で実装
【設計メモ】
・ダメージライン決定コードと連動している部分あり
→変更時に留意
1.H実数値ごとのB or Dの値を抽出
→H実数値は性格補正の影響を受けない
→"確1"ならば最大B or D,"確1耐え"ならば最小B or D
2.その際の耐久指数を計算
3.なんらかの処理
→2-3サンプルごとに値をプロット
→平均値の表示
6.13 ParameterSpecification-Mode(PS-Mode)
通常フローにおいては,H努力値0-252の64パターン,BorD努力値0-252の64パターン,性格補正3パターン,計12288パターンを一度に計算できるシステムを構築した。
しかしながら,実際のパラメータ設計においては以下の要素からある程度のパラメータが予め決定できることがわかる。
・耐久調整においては性格補正1.0 or 1.1に限定される
・耐久指数に余裕がある場合はH実数値を決定してから努力値配分が可能
・S調整を行ってから,他パラメータへと努力値を配分する
これらの条件から,性格補正を固定,かつすでに配分された努力値を除くパラメータを使用してダメージ計算を行うパラメータ指定モードを作成する。
※本機能はUIで配分した努力値合計が4より大きくないと効果を発揮しないことに留意
以下に拡張機能のフローを記述する。
コード追加内容を以下に示す。
実装したコードの一部を以下に示す。
【実装後の結果】
性格控えめ固定,S20振りのニンフィアがアーマーガアのダイスチル(A0,補正なし)を耐える努力値の組み合わせを算出する
ⅰH努力値指定なしの場合
HとBに残り努力値を最大488割いて,確1 耐え可能な組み合わせを導き出す。
ⅱ H努力値指定ありの場合(H実数値191になるように努力値164を降った場合)
H実数値191のときに上記条件を確1 耐えできる最小限のB努力値を算出する。
【設計メモ】
・防御側のBorDの判定が必要なためコードは,func_01ではなくMain_03のfunc_calBlockの後にif文で実装する
6.14 HequelBD-Mode(HeBD-Mode)
以下,ツイートを見ていつか実装してみたいと思った機能。
また,実数値計算式よりH=B+Dを満たす理論式を導き出し,簡易的にH=B+Dの条件を満たすか否かを判別可能にする。
AP-ModeもしくはPS-Modeにおけるデフォルト機能として本拡張機能を実装する 。努力値を無駄にしないコツ【H=B+Dについて】https://t.co/soJ1mGOrjb— とどりこ (@todoric0) December 3, 2019
・自由度のあるパラメータはH,B,D実数値の3値
・HBDに努力値最大合計508を割り振る
・
もしくはUI入力時の性格補正に固定
※インプットする努力値パターンだけで312,000あるため,性格補正はUI入力値のものに限定する。
※努力値パターンは先にzerosなどで配列を準備しておくと,計算処理が早くなる
【理論式】
実数値においてH=B+Dを満たす条件を基本公式より導き出す。
①-③式を定義する。
⑤式を出発式として,計算を進める
まずは性格補正なし(いじっぱり,ようき,ひかえめ,おくびょうなど)を想定する。
同様にB性格補正あり(わんぱく,ずぶといなど)を想定して計算を行う。
同様にD性格補正あり(しんちょう,おだやかなど)を想定して計算を行う。
10-12式についてまとめると以下のことがわかる。
※現時点で10-12式を0で満たすポケモンはなし
※各右辺iのレンジ外の扱いについては別途検討中
※全ポケモンの解析結果はこちら
【実装部分】
コード追加・記述箇所を以下に示す。①-③式を定義する。
⑤式を出発式として,計算を進める
まずは性格補正なし(いじっぱり,ようき,ひかえめ,おくびょうなど)を想定する。
同様にD性格補正あり(しんちょう,おだやかなど)を想定して計算を行う。
10-12式についてまとめると以下のことがわかる。
※各右辺iのレンジ外の扱いについては別途検討中
※全ポケモンの解析結果はこちら
【実装部分】
以下構文より入力する努力値パターンを作成する。
【コード:HeBD- Mode,入力配列作成部分】
simulinkモデルに入力する配列を以下に示す。
また,HeBD-Mode実装部分のsimulinkブロック図を下図に示す。
※計算量が多いので最低限のブロックでsimulinkを構成
Simulinkの出力配列を以下に示す。
上記の出力配列を8列目で昇順並べ替えを行い,絞ろ込みを行う。
絞り込みは以下表のレベルで行い,条件を満たす努力値配列を探し出す。
【コード:HeBD- Mode,データ処理】
【設計メモ】
・余談だが上記努力値パターンは312000ある,ひえーー
・余談だがベネディクト・カンバーバッチのイミテーション・ゲーム見ながら作ったので気分良く作れた笑
・input配列は初期立ち上げ時に計算する
→毎回計算するとめっさ時間食うん
・H=B+Dが成り立つケースが思ったよりないのか?
→絶対値の範囲をレベルごとで検討する
・理論式からHeBD-Modeの効果があるポケモンとないポケモンを算出できるかも
・プロットの方法
→HBのときDの情報をテキスト化,逆もしかり
・OpenDataを別で設立,HeBDの情報のみ出力(ついでにBC-Modeも作る)
・ほかモードと関連する詳しい解析は別記事で書いてもいいかもしれない
なにかあればコメントまで
【関連記事】
・余談だが上記努力値パターンは312000ある,ひえーー
・余談だがベネディクト・カンバーバッチのイミテーション・ゲーム見ながら作ったので気分良く作れた笑
・input配列は初期立ち上げ時に計算する
→毎回計算するとめっさ時間食うん
・H=B+Dが成り立つケースが思ったよりないのか?
→絶対値の範囲をレベルごとで検討する
・理論式からHeBD-Modeの効果があるポケモンとないポケモンを算出できるかも
・プロットの方法
→HBのときDの情報をテキスト化,逆もしかり
・OpenDataを別で設立,HeBDの情報のみ出力(ついでにBC-Modeも作る)
・ほかモードと関連する詳しい解析は別記事で書いてもいいかもしれない
6.x1 あとがき
本記事は随時更新予定です。なにかあればコメントまで
【関連記事】
コメント
コメントを投稿