【ポケモン】MATLABでダメージ計算ツールを作成するお話
MATLABでポケモンのダメージ計算ツールを作るためのノートです。
設計メモとして適当に書いているだけなので,ちらっと見たい方はどうぞ。
多分何いってんだこいつ?で終わると思う
【完成図】
現段階での,ポケモンダメージ計算ツールのUI画面を以下に示す。
1.初期画面
2.ダメージ計算画面
【現行機能】
1. AllPatern-Mode(1入力多出力システム)
A特化ガブリアスのじしんをギルガルドがどのラインで耐久可能か,H努力値0-252の64パターン,B努力値0-252の64パターン,性格補正0.9-1.1の3パターン,計12880パターンを一度に計算し,結果を出力する。
2. 1on1-Mode(1入力1出力システム)
A特化ガブリアスのじしんをH252ギルガルドにどれだけダメージが入るかを計算し,結果を出力する。
3. RunningTest-Mode(連続試験機能)
A特化ガブリアスのじしんをデータベースに登録してあるサンプル全てに計算を行う。
また,データベースに登録してあるサンプルの火力指数でB4ガブリアスがどこまで耐久できるか計算を行う
4. ParameterSpecification-Mode(パラメータ指定モード)
1.AP-modeの機能拡張版ダメージ計算モード。Df側の性格補正,努力値のインプット情報を指定して計算を行う。
以下,コンセプト,設計メモなど
【目次】
1.1 目的と背景
・MATLABを学生時代の最後の最後に購入。
持て余していたのでなにかに使えないかと半年くらい考える。
・もともとGoogleスプレッドシートでポケモンのダメージ計算ツールを自作していたことからMATLAB/Simulinkを活用したポケモンダメージ計算ツールが作成できないかと思案。
持て余していたのでなにかに使えないかと半年くらい考える。
・もともとGoogleスプレッドシートでポケモンのダメージ計算ツールを自作していたことからMATLAB/Simulinkを活用したポケモンダメージ計算ツールが作成できないかと思案。
・MATLABについては研究室3年間で主に利用したが,まだ使いこなせていない機能が多々あるため,遊びと勉強の意味でダメージ計算ツールを作成する。
・ポケモンUSUMからソードシールド発売まで暇だった。
・データベースとなるエクセルシート(ポケモン,わざ,どうぐのデータ)
→Googleスプレッドシートにて自作したものをダウンロード
・1火力指数に対して,性格3パターン,H努力値64パターン,BorD努力値64パターン
計12288パターンを一度に計算
・俗称"確1"などのラインでHBD努力値をプロットする。(横軸:H努力値,縦軸:BorD努力値)のイメージ
※計算は処理ごとに小数点以下切り捨て
3.1 H実数値
3.2 ABCDS実数値
3.3 ダメージ計算式
3.4 火力指数計算式
3.5 防御指数計算式
3.6 ダメージ/H計算式
(B,C,D,Sも同式にて計算する。)
※以下補足
・K_move:わざの威力
特性補正,もちもの補正を含める。
・K_at:攻撃側能力値
特性補正,もちもの補正,ランク補正,やけど補正を含める。
・K_df:防御側能力値
特性補正,もちもの補正,ランク補正を含める。
・K_b:+2前補正
以下順番にて補正を行う。。
1. 壁補正:リフレクター,ひかりのかべなど
2. 複数攻撃補正:ダブルバトルなど
3. 天候補正:はれ,あめなど
・K_a:+2後補正
以下順番にて補正を行う。
1. 珠補正:いのちのたま補正
2. 攻撃回数補正:つららばりなどの複数攻撃の場合
3. 急所補正:1.5倍をかける。(各実数値のランク補正も修正)
4. タイプ一致補正
5. タイプ相性補正
6. 達人の帯補正
7. 特性補正:マルチスケイル,あついしぼうなど
※補正詳細はダメージ補正リスト参照
一般的な火力指数計算とことなる部分があるため,補足を参照されたい。
※以下補足
・K_at:攻撃に関する補正係数をかけ合わせたもの
※エレキフィールドなどのフィールド補正は”わざ威力に関する特性補正”に含まれる
※補正詳細はダメージ補正リスト参照
※タイプ相性補正は火力指数にばらつきが出るため削除
一般的な耐久指数計算とことなる部分があるため,補足を参照されたい。
※以下補足
・K_df:防御に関する補正係数をかけ合わせたもの
※あついしぼう,マルチスケイルなどは”その他特性補正”に含まれる
※補正詳細はダメージ補正リスト参照
※逆数を入力(あついしぼう発動時,係数0.5 となるが,逆数を取り2を入力する)
※火力指数/耐久指数表示コードはfunc_calDmg内に記述
ダイマックス設定ON時にHP実数値を2倍する
下記スリップAも2倍扱いとする
※分母の値に加算,減算は行わない
※スリップダメージ処理
スリップダメージをA,Bに分類する
A:フィールドにポケモンを出した際に受けるダメージ(ステロ,まきびしなど)
B:ターンの終わりにポケモンが受けるダメージ(天候スリップ,状態異常など)
【Simulinkモデル】
・
1.2 環境
・MATLAB 2019a・データベースとなるエクセルシート(ポケモン,わざ,どうぐのデータ)
→Googleスプレッドシートにて自作したものをダウンロード
2. 基本コンセプト
・ポケモンのダメージ計算ツールとしての基本機能を実装・1火力指数に対して,性格3パターン,H努力値64パターン,BorD努力値64パターン
計12288パターンを一度に計算
・俗称"確1"などのラインでHBD努力値をプロットする。(横軸:H努力値,縦軸:BorD努力値)のイメージ
ツールのコンセプト |
3.基本公式
ダメージ計算ツールに使用する基本式を以下に示す。※計算は処理ごとに小数点以下切り捨て
3.1 H実数値
3.2 ABCDS実数値
3.3 ダメージ計算式
3.4 火力指数計算式
3.5 防御指数計算式
3.6 ダメージ/H計算式
3.1 H実数値
①式より,H実数値を計算する。3.2 ABCDS実数値
②式より,A実数値を計算する。(B,C,D,Sも同式にて計算する。)
3.3 ダメージ計算式
③式より,ダメージを計算する。※以下補足
・K_move:わざの威力
特性補正,もちもの補正を含める。
・K_at:攻撃側能力値
特性補正,もちもの補正,ランク補正,やけど補正を含める。
・K_df:防御側能力値
特性補正,もちもの補正,ランク補正を含める。
・K_b:+2前補正
以下順番にて補正を行う。。
1. 壁補正:リフレクター,ひかりのかべなど
2. 複数攻撃補正:ダブルバトルなど
3. 天候補正:はれ,あめなど
・K_a:+2後補正
以下順番にて補正を行う。
1. 珠補正:いのちのたま補正
2. 攻撃回数補正:つららばりなどの複数攻撃の場合
3. 急所補正:1.5倍をかける。(各実数値のランク補正も修正)
4. タイプ一致補正
5. タイプ相性補正
6. 達人の帯補正
7. 特性補正:マルチスケイル,あついしぼうなど
※補正詳細はダメージ補正リスト参照
3.4 火力指数計算式
④式より,火力指数を計算する。一般的な火力指数計算とことなる部分があるため,補足を参照されたい。
・K_at:攻撃に関する補正係数をかけ合わせたもの
※補正詳細はダメージ補正リスト参照
※タイプ相性補正は火力指数にばらつきが出るため削除
3.5 耐久指数計算式
⑤式より,耐久指数を計算する。一般的な耐久指数計算とことなる部分があるため,補足を参照されたい。
※以下補足
・K_df:防御に関する補正係数をかけ合わせたもの
※補正詳細はダメージ補正リスト参照
※逆数を入力(あついしぼう発動時,係数0.5 となるが,逆数を取り2を入力する)
※火力指数/耐久指数表示コードはfunc_calDmg内に記述
3.6 ダメージ/H計算式
※ダイマックスについてダイマックス設定ON時にHP実数値を2倍する
下記スリップAも2倍扱いとする
※分母の値に加算,減算は行わない
※スリップダメージ処理
スリップダメージをA,Bに分類する
A:フィールドにポケモンを出した際に受けるダメージ(ステロ,まきびしなど)
B:ターンの終わりにポケモンが受けるダメージ(天候スリップ,状態異常など)
以下Simulinkモデルにて,スリップAを実装する。
※回復ソース処理
回復ソースをA,Bに分類する
A:毎ターン回復する回復ソース(たべのこしなど)
B:条件により発動する回復ソース(オボンのみなど)
4. 機能フローチャート
ダメージ計算ツールの機能フローチャートを以下に示す。また,一部UIのコードを以下に示す。
【コード:UI Figureの準備】
【コード:UI Hパラメーターの設定】
【コード:UI チェックボタンなど】
5. 基本機能
実装する基本機能概略を以下に示す。5.1 データの読み込み
5.1.1 データベース
5.1.2 設定値
5.2 Simulink モデルの作成
5.3 データ配列( 入力と出力)
5.4 配列のデータ処理
5.4.1 データのソート
5.4.2 ダメージライン処理
5.4.3 データの配列長さ,最大値,最小値の計算
5.5 Plot切り替え機能
5.6 Axis自動調整機能
5.7 特別なデータ処理
5.8 S実数値計算処理
5.1 データの読み込み
5.1.1 データベース
下記表に示すデータベースをUI起動時に読み込む。5.1.2 設定値
UI起動後,各パラメータを設定する。→ダメージ補正リスト参照
5.2 Simulinkモデルの作成
式①-⑤を実装するSimulinkモデルを作成する。
Simulinkの概略は下図に示す。
火力指数計算部分
【コード:入力配列】
5.3 データ配列(入力と出力)
入力するデータ配列
一般的なfor文を用いることで性格補正3パターン,H努力値64パターン,BD努力値64パターンの計12288パターンのデータ配列を生成し,サンプル時間ごとに各値を入力する。【コード:入力配列】
出力するデータ配列
simulinkモデルで③式の数値計算後,1.00-0.85の16パターンの乱数処理を行い,データを取得する。取得するデータ配列には列ごとに以下のデータを格納する。このとき配列は12288行まであり,4096行ごとに性格補正が異なる。
格納するデータ配列は以下の図のようになる。
【変更点】
2-17列目:ダメージをH実数値で割った値
26-42列目:ダメージの自体の値(追加)
【コード:データのソート】
5.4 配列のデータ処理
simulinkより得たデータ配列に対して処理を行う。データ処理ごとの配列名は以下表の用に定義する。
5.4.1 データのソート
以下手順にてデータ処理を行い,ダメージの大きい順,かつ,振り分け努力値合計の少ない順に性格補正ごとのデータ配列を生成する。
5.4.2 ダメージライン処理
各データに対し,条件ごとに各表の処理を行う。【変更点】
→組み合わせることにより,表示更新時に不具合発生。
・確1の条件と乱数の条件を分離
【コード:ダメージライン処理】
5.4.3 データ配列の長さ,最大値,最小値の計算
各データの配列の長さ,最大値,最小値を計算する。※重複処理:H実数値,BD実数値の組み合わせに重複がないようにデータ処理を施す。
5.5 Plot切り替え機能
①性格補正ごとのデータ表示を可能にするため,UIにポップアップボタンを設置②各ボタンには性格ごとのデータを表示・非表示にするコールバックを設定
③データ数に応じて表示するデータを選択する。
→Main_03
→Main_03
→func_00
→func_02
→func_pltAxi
パターンごとの最小値,最大値は次の表に示す。
Plot構文を改良【変更点】
before
上表のパターンごとにプロットを変更
→2進数×3の8パターンなら処理できるが,パターン数が増えるとコードが長くなる
after
plot構文に''DisplayName'を追加
x軸はxlim autoで代用
※BC-Mode追加に伴う変更
UIで指定しするHBD努力値,性格補正による実数値を別色でプロットに反映する。
→防御側ポケモンの物理特殊判定に依存する。
下図より,UIに反映される実数値がプロット画面にも反映されていることがわかる。(オレンジ点)
【追加コード】
各補正を行う際のフラグを下記に示す。
※ポケモンのタイプ変更について
以下フラグを取得する(変更時に1を立てる)
Opr.n.type_c_at1 = 0
Opr.n.type_c_at2 = 0
Opr.n.type_c_df1 = 0
Opr.n.type_c_df2 = 0
パラメータのUpdate時にフラグをOFFにする。
そこでUI立ち上げ時に種族値パターンを入力し,最速,準速などの表を作成する。
当機能実装により得られる表は次のようになる。
プッシュボタンにより常時,この配列を呼び出すことが可能である。
→配列を出すよりも図で出したほうがわかりやすいか検証
Figureに横軸種族値,縦軸実数値としてプロットした場合。
Simulinkモデルは新たに"Model_04_delta"を,コードは"func_11"を新設する。
Simulinkモデルを通し,以下データを配列に格納する。
作成するSimulinkモデルは以下となる。
5.6 Axis自動調整機能
表示するデータパターンに応じて,X軸の最小値,最大値を変更する。パターンごとの最小値,最大値は次の表に示す。
before
上表のパターンごとにプロットを変更
→2進数×3の8パターンなら処理できるが,パターン数が増えるとコードが長くなる
after
plot構文に''DisplayName'を追加
x軸はxlim autoで代用
※BC-Mode追加に伴う変更
UIで指定しするHBD努力値,性格補正による実数値を別色でプロットに反映する。
→防御側ポケモンの物理特殊判定に依存する。
下図より,UIに反映される実数値がプロット画面にも反映されていることがわかる。(オレンジ点)
【追加コード】
5.7 特別なデータ処理
Zわざ,ダイマックス発動時のわざの威力,追加効果などを補正する。各補正を行う際のフラグを下記に示す。
※ポケモンのタイプ変更について
以下フラグを取得する(変更時に1を立てる)
Opr.n.type_c_at1 = 0
Opr.n.type_c_at2 = 0
Opr.n.type_c_df1 = 0
Opr.n.type_c_df2 = 0
パラメータのUpdate時にフラグをOFFにする。
5.8 S実数値計算処理
努力値配分時にすべてのポケモンのS実数値を毎度計算して確認するのは面倒である。そこでUI立ち上げ時に種族値パターンを入力し,最速,準速などの表を作成する。
→配列を出すよりも図で出したほうがわかりやすいか検証
Figureに横軸種族値,縦軸実数値としてプロットした場合。
Simulinkモデルは新たに"Model_04_delta"を,コードは"func_11"を新設する。
Simulinkモデルを通し,以下データを配列に格納する。
作成するSimulinkモデルは以下となる。
【コード:func_11】
【改良メモ】
・表よりも図としてアウトプットしたほうが面白そう
→【ポケモンMATLABダメ計】拡張機能リスト
基本機能に追加する各拡張機能について記述する。
6.1 x16-Mode
6.2 x16MaxDisp-mode
6.3 DamageLineDecision-Mode(DLD-Mode)
6.4 x16Change-Mode
6.5 Exchange-Mode
6.6 NewOpenVar-Mode(NOV-Mode)
6.7 MovePowerChange-Mode(MPC-Mode)
6.8 MaximumHBD-Mode(MHBD-Mode)
6.9 1on1-Mode
6.10 RunningTest-Mode(RT-Mode)
6.11 DamageKeeping-Mode(DK-Mode)
6.12 BoundaryCalculate-Mode(BC-Mode)
また,各モードの突入可否を下表にまとめる。
→【ポケモンMATLABダメ計】ダメージ補正リスト
ダメージ計算ツールに実装した各補正と簡潔な詳細を示す。
7.1 特性補正
7.2 もちもの補正
7.3 その他補正
7.4 スリップダメージ
7.5 わざ補正
・わざダメージ変更
・火力指数,防御指数の計算
・DamageLine自動算出
・攻守交代
・特性,もちものなどの倍率補正を実装
→マルチスケイル,ファントムガード初撃のみ対応
→DK-Modeと併用すれば一応計算可能
・DamageLineDecision-Modeとダメージライン処理の合体
・確2or乱1という表記だとダメージラインが分かりづらいため変更検討
・func00にデータベースの更新を含める
・ダメージ/Hの基本式を設定。
トグルボタン
→1−1計算システム→拡張機能1on1(モード変更)→精密計算システム
→Zわざ発動,きのみ,一部特性発動条件
・ダメージ保留機能→次のダメ計と累計して計算可能なモード
・RankをA-Sそれぞれ決定できる改良(めんどくさいやつ)
・特定の実数値入力で対象の配列のみ表示する機能→拡張機能pullout
・Zわざ,キョダイマックスわさについて追記
・ダイマックスのさわダメージ補正(ダイマックス時に補正のかかる特性も判別)
・Zわざのダメージ補正
・状態2のUI更新
・指定努力値版通常フロー
→先に努力値を割り振るところに割り振っておく(SとかHとか)
→残り努力値を使用した通常フローを行い,ダメージラインを計算する。
・特定に実数値を実現する努力値を算出する機能
・プッシュボタンで一部情報を引き出せる機能
・設計中の努力値をメモできる機能
6. 拡張機能
ノートが長くなるため別記事に詳細をまとめる→【ポケモンMATLABダメ計】拡張機能リスト
7. ダメージ補正の概要
ノートが長くなるため別記事に詳細をまとめる→【ポケモンMATLABダメ計】ダメージ補正リスト
9. 課題リスト
・Openver
→マルチスケイル,ファントムガード初撃のみ対応
→DK-Modeと併用すれば一応計算可能
→
→Zわざ発動,きのみ,一部特性発動条件
・
・
・状態2のUI更新
・特定に実数値を実現する努力値を算出する機能
・プッシュボタンで一部情報を引き出せる機能
・設計中の努力値をメモできる機能
MATLABでポケモンツールとは,すごくおもしろいです.私も長年,作りたいなと思っていました.ぜひ,ソースコードなどをみせていただけるとありがたいなと思いました.
返信削除コメントありがとうございます。
削除まだ実装するべき機能がたくさんあるので,ソースコードはまだ公開しづらいとこがあるのが,正直なところです。
本記事の4章や6章のフローチャート通りにソース書いているくらいしかまだ言えないです笑