【ポケモンMATLABダメ計】拡張機能リスト

本記事は以下リンクの補足として扱う。
以下内容を示す。

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 更新履歴


また,各モードの突入可否を下表にまとめる。
No.Modeダメージ
計算
ダメージ
ライン
x/16Plot
09,10,11
ExchangeOpenData
1x16Pre-Mode
2x16MaxDisp-Mode
3x16-Mode乱数のみ乱数のみ
4DLD-Mode
5x16Change-Mode
6Exchange-Mode
7MOV-Mode
8MPC-Mode
9HMBD-Mode
101on1-Mode
11RunningTest-Mode
12DK-Mode
13BC-Mode
14
15
16
17
18
19
20
※一部拡張モードへの遷移方法としてUI上のトグルボタンのON,OFFを使用しいたが,
 拡張モードのON状態が重複してしまうことを考慮し,プルダウン形式に変更する。

6.1 x16-Mode

拡張機能詳細フラグ
x16Pre-Modedmg(1.00)-dmg(0.85)のx/16データを26列目に格納n.x16_start
x16-Modex/16の条件をみたすデータを抽出
確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の表示データに依存している

6.2 x16MaxDisp-mode

拡張機能詳細フラグ
x16MaxDisp-modex16-Modeの計算結果をplotに反映,x16-Mode内に設置n.x16_set
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内から外に出すことが可能
→ダメージ計算一周目からデータ表示数を制限できる

6.3 DamageLineDecision-mode(DLD-Mode)

拡張機能詳細フラグ
DamageLineDecision-ModeDamageLineを自動確定させるn.dld_set
ダメージラインの条件を自動確定する拡張機能を実装する。条件式としては’x16MaxDisp-Modeで求めた計算値が空でない’,かつ,’ModeフラグON’の論理値とする。
DLD-Modeでは,”配列の各列ごとに条件に当てはまる行が最低1行存在すればよい”という考えのもと条件を絞り出す。
上図より,次の4領域の値をif文の条件の各閾値として設ける。
領域ダメージラインデータ
乱xdmg(1.00) Max
確xdmg(0.85) Max
乱x耐えdmg(1.00) min
確x耐えdmg(0.85) min

領域ダメージラインデータ
乱xdmg(1.00) Max
確xdmg(0.85) Max
確x耐えdmg(1.00) min
乱x耐えdmg(0.85) min
※修正
・1on1-Modeにて格納するダメージ配列は1行であるため,DLD-Modeにおける処理にバグが発生していることが判明
→本来は乱3耐えの判定だが,配列が1行しかないため,確3耐えのフローに入ってしまう
→DLD-Modeの確x耐えと乱x耐えの突入条件が逆となっていたため修正

条件の優先度,条件式は下表を基準とする。
また,if文のケース判別は(性格補正0.9の条件式 or 性格補正の1.0 条件式or 性格補正の1.1条件式)の論理値に依存させる。
優先度条件条件式分類x16-Mode
1確1dmg(0.85) >= 1.00At-
2乱1dmg(1.00) >= 1.00At1.00
3確4耐えdmg(1.00) < 0.25Df-
4乱4耐えdmg(0.85) < 0.25Df0.25
5確2dmg(0.85) >= 0.50At-
6乱2dmg(1.00) >= 0.50At0.50
7確3耐えdmg(1.00) < 0.33Df-
8乱3耐えdmg(0.85) < 0.33Df0.33
9確3dmg(0.85) >= 0.33At-
10乱3dmg(1.00) >= 0.33At0.33
11確2耐えdmg(1.00) < 0.50Df-
12乱2耐えdmg(0.85) < 0.50Df0.50
13確4dmg(0.85) >= 0.25At-
14乱4dmg(1.00) >= 0.25At0.25
15確1耐えdmg(1.00) < 1.00Df-
16乱1耐えdmg(0.85) < 1.00Df1.00
else

上表の制約条件を数直線上に示すと下図となり,線消し部分の条件を省略しても,すべての領域を条件が満たすことが可能となる。
このとき,if文のフローをⅰ→ⅱ→ⅲ→ⅳ→ⅴの優先度で設定する。
【コード:DLD-Mode】

【変更点】
・ダメージライン条件を変更(5.4.2 ダメージライン処理参照)
・領域が重なる部分は省略


6.4 x16Change-Mode

拡張機能詳細フラグ
x16Change-mode性格補正の表示変更時にx16の最大数をUIに反映するn.x16_axi
plot09-11を選択時に,x/16のUI表示をx16MaxDisp-Modeで算出した値に変更する。

【コード:x16change-Mode】

6.5 Exchange-mode

拡張機能詳細フラグ
Exchange-Mode攻守交代n.exchange
攻守交代機能を持ったプッシュボタンをUIに実装する。
設定した値(ポケモン,性格,Lv, 個体値,努力値,もちもの,状態,ランク)を交換する。func00と機能が酷似しているため,func00内にソースコードを書き,ModeフラグのON,OFFで切り替えを行う。

【コード:Exchange-Mode:データの一時記録】

【コード:Exchange-Mode:データの交換】
 【コード:Exchange-Mode:UIへの反映】


6.6 NewOpenVar-Mode(NOV-Mode)

拡張機能詳細フラグ
NewOpenVar-Mode特定のH実数値,BorD実数値の配列を表示するn.nov1,n.nov2
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突入後のデータ処理を判別する。詳細を下表に示す。
n.nov1n.nov2n.novbinデータ処理
113H実数値,BD実数値が一致する配列のみ抽出
102H実数値が一致する配列のみ抽出
011BD実数値が一致する配列のみ抽出
000モード突入する前にはじかれる
※表示するデータは5.5節で選択されている性格に依存する。
※性格を選ばずにOpenDataを行う場合,構造体の最上位ファイルが表示される。

6.7 MovePowerChange-Mode(MPC-Mode) 

拡張機能詳細フラグ
MovePowerChange-Modeわざの威力を任意に変更するn.mpc
わざの威力を任意に変更するモード。
(後に実装するはたきおとすやエラがみなどの威力変更を一時的に任意に変更する)
Editにより数値を直接入力し,計算に反映させる。パラメーター更新により数値をもとに戻すこと可能。


6.8 MaximumHBD-Mode( MHBD-Mode) 

拡張機能詳細フラグ
MaximumHBD-Mode努力値252をH,BDに振り分ける最大効率を表示するn.mhbd
H-BDに努力値をどの配分で振れば,最大耐久指数が実現できるか確認するモード。
コンセプトはツイッターで以下投稿を見て真似てみたお話。
ツール立ち上げ時にダメージ計算結果プロット画面がからの状態だったので,この指標を載せることを決定。ツール立ち上げ時,もしくはパラメータアップデート時にダメージ計算結果を消去し,H-BDの配分結果を載せる。
64行の努力値データを用意し,Simulinkにインプット,計算を行い配列データを入手する。(1列目,6列目は性格補正,ならびにBorDの6パターン存在する)
列番号格納データ備考
1耐久指数Simulinkで計算(アウトプット)
2H努力値0:4:252のデータ配列(インプット)
3BD努力値252:4:0のデータ配列(インプット)
4H実数値Simulinkで計算(アウトプット)
5BorD実数値(性格補正0.9-1.1)Simulinkで計算(アウトプット)
6
7
8
9
10

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

拡張機能詳細フラグ
1on1-Mode1入力1出力モードに計算方法を変更するn.m1on1
【コンセプト】
本ツールの主目的と異なり,すべての努力値パターンの計算に対し,1パターンの努力値のみの計算を行う。(通常のダメージ計算)
1on1-Modeによりダメージ計算を行った際のUI画面を以下に示す。


1on1-Mode追加に伴い,コード追記した部分を以下に示す。
No.コート追加部分詳細
1Main03Simulinkのシミュレーション時間変更
2func_calDmg計算結果を一時的に09-11に格納
DLD-Modeの構文一部に追記
3func_pltAxiplot方法を変更
4func_04OpenDataの構文を追記
【コード:1on1- mode】
plotに関するコードを以下に示す。
【変更点】
・damage10_2をプロットデータとして扱っていたが,バグ取りのためdamage10に変更
→実際データ処理してあろうがなかろうが関係ない部分なのでこの処理でいいはず
・0.85と1.00のdamage/Hだけでなくdamageのテキストプロットがある方がわかりやすいと判断


【解決するべき課題】
・データの表示方法
・OpenData
・DamageKeeping-Modeの追加


6.10 RunningTest-Mode

拡張機能詳細フラグ
RunningTest-mode連続計算モード。1on1-Modeを更に拡張する。n.mrt_at,n.mrt_df
【コンセプト】
ポケモンのダメージ計算時に各パラメータを毎度変更するのは手間がかかる
パターン分けを考慮すると計算量は多くなる

1.予めポケモンの努力値配分,持ち物,ステータスなどをテーブルとして保存
2.1攻撃パターンから防御側テーブル or 1防御パターンから攻撃側テーブルへ
3.一度のシミュレーションで複数のパターンの計算を行う
4.ダメージの多い順にソートする。

イメージとしてはダメージ計算する際に
・ガブリアスいじっぱりA252のげきりん
・ガブリアスいじっぱりA252のげきりん+ハチマキ
・ガブリアスいじっぱりA252のげきりん+珠
・ガブリアスいじっぱりA252のげきりん+つるぎのまい
・ガブリアスいじっぱりA252のげきりん+珠+つるぎのまい
など性格をいじっぱり→ようきにするなど複数のパターンを毎回設定値を変更して計算するのがめんどくさいので,一度にできないかな?というもの

パラメータ設定の正確性が向上
オーソドックスな攻撃パターン,防御パターンをデータ化
テストしたい努力値パターンに入力し,あらゆるパターンを計算
ダメーイラインの明確化

【実装内容】
RT-Modeのフローを以下に示す。
No.作業内容詳細
1DBの用意googleスプレッドシートにて,データベースを作成する。
作成したスプレッドシートはExcel形式にてダウンロードする。
→Main_03
2DBの読み込みAt or Dfの分類にて読み込むデータを選別,
実数値を必要としない補正データを計算する。
→func_01,func_02,func_calPre
3実数値の計算読み込みDBと補正データを元に実数値を計算する。
→Model_04_beta
4配列の準備実数値を元に補正データを用意する。
ダメージ補正リスト
→func_01,func_02,func_calPre,func_calBlock
5ダメージ計算simulinkモデルにてダメージ計算を行う。
→Model_04
6データ処理構想体配列に任意の順番でデータを保存していく。
→func_calMRT

用意するデータベースは以下のようにgoogleスプレッドシートを用いて作成する。
※DB作成時の注意
→Atサンプルについてはダイマックスありなし,ステロありなしの4パターンができる

コード追加部分を下記に示す。
No.コード追加部分詳細
1Main03db5の読み込み
Simulink計算時間を変更する記述を追加
→1on1-Modeより優先度を高くする
RT-Mode起動フラグを初期化
2func_01RT-Mode起動時に抽出したデータの情報をfor文で配列に格納する
3func_02モードAtの場合Atの,モードDfの場合Dfの実数値のみUIに反映する。
4func_calPreRT-Mode起動時に抽出したデータの情報をfor文で配列に格納する
5func_calblockRT-Mode起動時に抽出したデータの情報をfor文で配列に格納する
6func_calSufモードAtに場合のみ,一部テキストを表示する。
7func_calMRTデータ処理用の新コード。
8func_calMRT2プロット用の新コード。
9func_calMRT3データ保存用の新コード。
10
【コード:RT- Mode】
いくつかの専用コードを以下に示す。

※for文による配列データの作成

※強制書き換え

RT-Mode起動の際に置換する構造体リストを以下に示す。
分類Atの場合:入力データが攻撃側,DBデータが防御側
分類Dfの場合:DBデータが攻撃側,入力データが防御側
No.元の構造体RT-Modeの置換構造体分類
1Opr.cal.cor_fn_BOpr.mrt.cal.cor_fn_B(i,1)-
2Opr.n.move_typeOpr.mrt.n.move_type(i,1)Df
3Opr.n.tokusei_skinOpr.mrt.tokusei_skin_mrt(i,1)Df
4Opr.n.type_df1Opr.mrt.n.type_mrt1(i,1)At
5Opr.n.type_df2Opr.mrt.n.type_mrt2(i,1)At
6Opr.para.bring_atOpr.mrt.para.bring_mrt{i,1}Df
7Opr.para.bring_dfOpr.mrt.para.bring_mrt{i,1}At
8Opr.para.crtOpr.mrt.para.crt_mrt(i,1)Df
9Opr.para.dm_atOpr.mrt.para.dmmove_mrt(i,1)Df
10Opr.para.dm_dfOpr.mrt.para.dmmove_mrt(i,1)At
11Opr.para.doubleOpr.mrt.para.double_mrt{i,1}Df
12Opr.para.fieldOpr.mrt.para.field_mrt{i,1}Df
13Opr.para.jdg_atOpr.mrt.para.jdg_at(i,1)Df
14Opr.para.jdg_dfOpr.mrt.para.jdg_df(i,1)At
15Opr.para.moveOpr.mrt.para.move_mrt{i,1}Df
16Opr.para.move_j01Opr.mrt.para.move_j01_mrt(i,1)Df
17Opr.para.move_j02Opr.mrt.para.move_j02_mrt(i,1)Df
18Opr.para.move_j03Opr.mrt.para.move_j03_mrt(i,1)Df
19Opr.para.move_j04Opr.mrt.para.move_j04_mrt(i,1)Df
20Opr.para.move_j05Opr.mrt.para.move_j05_mrt(i,1)Df
21Opr.para.move_j06Opr.mrt.para.move_j06_mrt(i,1)Df
22Opr.para.move_j07Opr.mrt.para.move_j07_mrt(i,1)Df
23Opr.para.move_powerOpr.mrt.para.move_power_mrt(i,1)Df
24Opr.para.move_sortOpr.mrt.para.move_sort_mrt{i,1}Df
25Opr.para.move_typeOpr.mrt.para.move_type_mrt{i,1}Df
26Opr.para.numattackOpr.mrt.para.numattack_mrt(i,1)Df
27Opr.para.poke_atOpr.mrt.para.move_mrt{i,1}Df
28Opr.para.status_atOpr.mrt.para.status_mrt(i,1)Df
29Opr.para.status_dfOpr.mrt.para.status_mrt(i,1)Df
30Opr.para.tokusei_atOpr.mrt.para.tokusei_mrt{i,1}Df
31Opr.para.tokusei_dfOpr.mrt.para.tokusei_mrt{i,1}At
32Opr.para.type_at1Opr.mrt.para.type_mrt1(i,1)Df
33Opr.para.type_at2Opr.mrt.para.type_mrt2(i,1)Df
34Opr.para.type_df1Opr.mrt.para.type_mrt1(i,1)At
35Opr.para.type_df2Opr.mrt.para.type_mrt2(i,1)At
36Opr.para.wallOpr.mrt.para.wall_mrt{i,1}Df
37Opr.para.weatherOpr.mrt.para.weather_mrt{i,1}Df
38Opr.para.zi_at(6)Opr.mrt.para.zi_mrt(i,6)Df
39Opr.para.zi_df(6)Opr.mrt.para.zi_mrt(i,6)At
40Opr.para.strkOpr.mrt.para.strk_mrt(i,1)Df
41Opr.para.kdmkOpr.mrt.para.kdmk_mrt(i,1)Df
42Opr.para.kdmgOpr.mrt.para.kdmg_mrt(i,1)Df
43Opr.para.mkbs1Opr.mrt.para.mkbs1_mrt(i,1)Df
44Opr.para.mkbs2Opr.mrt.para.mkbs2_mrt(i,1)Df
45Opr.para.mkbs3Opr.mrt.para.mkbs3_mrt(i,1)Df
46
47
48
49
50

【RT-Modeの出力結果】
上記RT-Modeにより,計算した結果の一例を示す。

RunningTestAt-Modeの場合
ニンフィアのハイパーボイスを入力値とする。
出力として以下のような配列を得ることができる。


現時点で43パターンのポケモンを一度にダメージ計算することが可能である。

RunningTestDf-Modeの場合
HB特化アーマーガアを入力値とする。
出力として以下のような配列を得ることができる。



現時点で331パターンのポケモンを一度にダメージ計算することが可能である

ⅰ,ⅱより,データベース作成を進めることで更に多くのサンプルを同時に計算することが可能となる。この機能により,想定外のパターンの計算や,新たな耐久調整先の指針を立たせることが可能となる。

【RT-Modeのデータベース作成指針について】
DBとして入力する情報テーブルの作成指針について,以下のようにまとめる。

ランク補正などの場合分けを増やすと,計算後の判別が難しくなることがわかったため,最低限のデータ量に抑える必要あり
・Atの場合
No.iInput(At)→DB(Df)のデータ(At
1基本パターン
(ランクなし)
ex B4ドリュウズ
→Code:ASドリュウズ,HBアーマーガアなど
2基本パターン+ステロ
1にステロダメージ追加
※その他スリップA類はUIで入力
3ダイマックス
※H2倍のためDBでは扱わない
4持ち物によって能力値が変わる場合
ex ポリゴン,ラッキーなど
5天候補正などフィールドの補正
→すなあらし,グラスフィールドなど
6その他
ザマゼンタのように最初からランク補正が入る
※ミミッキュはばけのかわスリップありなし両方計算する
→かたやぶりも考慮

・Dfの場合
No.DB(At)→input(Df)のデータ(Df
1基本パターン
(努力値252,もちものなし,ランクなし)
ex ガブリアス
→ようき,いじっぱのデータがほしい
・いじっぱの場合
→A特化ガブげきりん
・ようきの場合
Aガブげきりん
2メガネ,ハチマキ火力の計算
→ 基本特化,一部通常補正も考慮
→A特化鉢巻ガブげきりん
3天候補正などフィールドの補正
→はれ,あめ,フィールド
4ダイマックスわざ
→初撃の状態のみを考慮
→ダイホロウのB-1などは考慮しない
※ダイマックス技は最大火力がでるわざを考慮


【設計メモ】
・なるべくオリジナルの構文通りに拡張機能を実装する。
・構造体の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があっっつくなるというデメリットがあったためそっと封印したのだが,今回あらためて実装してみようかなと思った次第です。

6.11 DamageKeeping-Mode

拡張機能詳細フラグ
Damagekeeping-Modeダメージ計算配列を一時保存し,次の計算に反映する。n.mdk
【コンセプト】
ダメージ計算した際の配列を一時保存して,次の計算結果に反映する。
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)

拡張機能詳細コード
BoundaryCalculate-modeダメージの境界算出モード。デフォルトで起動する。func_pltAxi
【コンセプト】
本作成ツールにおいて,"確1"や”確1耐え”の計算結果が出た際に,H-BDの耐久指数のラインが表示される。(以下図の右側に現れるプロットにななめのラインができている)
このときの斜めのラインの耐久指数を自動計算する拡張機能を実装する。(デフォルト)

記述コードの内容を以下に示す。
No.コード手順
1ダメージライン処理で抽出した正確補正ごとの
配列を垂直結合する
2H実数値の最大値と最小値を算出
3各H実数値の最大BorD実数値,耐久指数を
抽出する。
1列目:H実数値
2列目:BorD実数値
3列目:耐久指数
4列目:damage1.00
そのた必要な情報を追記
1で算出した値を用いてfor文処理
Opr.n.dmgline_atdf == 1のとき最大値を
Opr.n.dmgline_atdf == 0のとき最小値を抽出
4表示用データの生成
plotに反映する数字を算出する。
配列の最大値もしく最小値を配列から引き,
その絶対値を取得する
5ダメージ順に並び替え
6plotに反映
At→0が表示される点が一番攻めきれる
df→0が表示される部分がギリギリ耐えきれる
7文字列と結合し,openvarで表示する

【コード: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)

拡張機能詳細フラグ
ParameterSpecification-Mode一部パラメータを指定した通常フローによる計算。n.mps

通常フローにおいては,H努力値0-252の64パターン,BorD努力値0-252の64パターン,性格補正3パターン,計12288パターンを一度に計算できるシステムを構築した。
しかしながら,実際のパラメータ設計においては以下の要素からある程度のパラメータが予め決定できることがわかる。

・耐久調整においては性格補正1.0 or 1.1に限定される
・耐久指数に余裕がある場合はH実数値を決定してから努力値配分が可能
・S調整を行ってから,他パラメータへと努力値を配分する

これらの条件から,性格補正を固定,かつすでに配分された努力値を除くパラメータを使用してダメージ計算を行うパラメータ指定モードを作成する。

本機能はUIで配分した努力値合計が4より大きくないと効果を発揮しないことに留意

以下に拡張機能のフローを記述する。
No.SP-Modeの判定フロー
1配列の初期化
2余り努力値の算出,物理特殊判定
3H努力値の判定
H=0のとき
 BorDに余り努力値を配分
else
 HとBorDで配分
4作成配列の確認
5from workspace用の配列の作成
6準初期化

コード追加内容を以下に示す。
No.コート追加部分詳細
1Main03拡張機能のswitch文にコードを追加
2simulink計算時間の変更
func_07メインコードの記述
3func_calDmg出力配列のデータ処理について追記
4func_pltAxi表示データの選択について追記
【コード: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文で実装する


6.14 HequelBD-Mode(HeBD-Mode)

拡張機能詳細フラグ
HequelBD-ModeH=B+Dを満たす調整を算出する機能para.hebd
【コンセプト】
以下,ツイートを見ていつか実装してみたいと思った機能。
また,実数値計算式よりH=B+Dを満たす理論式を導き出し,簡易的にH=B+Dの条件を満たすか否かを判別可能にする。
AP-ModeもしくはPS-Modeにおけるデフォルト機能として本拡張機能を実装する 。

・自由度のあるパラメータは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などで配列を準備しておくと,計算処理が早くなる

【理論式】
実数値においてH=B+Dを満たす条件を基本公式より導き出す。
①-③式を定義する。
⑤式を出発式として,計算を進める
まずは性格補正なし(いじっぱり,ようき,ひかえめ,おくびょうなど)を想定する。


同様にB性格補正あり(わんぱく,ずぶといなど)を想定して計算を行う。


同様にD性格補正あり(しんちょう,おだやかなど)を想定して計算を行う。

10-12式についてまとめると以下のことがわかる。



※現時点で10-12式を0で満たすポケモンはなし
※各右辺iのレンジ外の扱いについては別途検討中
※全ポケモンの解析結果はこちら

【実装部分】
コード追加・記述箇所を以下に示す。
No.コート追加部分詳細
1Main03simulinkによるダメージ計算後,
特定モード時に起動するコード追加
2func_09メインコードの記述

以下構文より入力する努力値パターンを作成する。
【コード:HeBD- Mode,入力配列作成部分】

simulinkモデルに入力する配列を以下に示す。
No.格納データ分類
1H努力値配列input
2B努力値配列input
3D努力値配列input
4合計努力値配列input
5性格補正0.9input
6性格補正1.0input
7性格補正1.1input
8
9
10
【コード:HeBD- Mode,入力配列作成部分2とsimulinkモデル起動部分】

また,HeBD-Mode実装部分のsimulinkブロック図を下図に示す。
※計算量が多いので最低限のブロックでsimulinkを構成

Simulinkの出力配列を以下に示す。

No.格納データ分類
1H努力値配列input
2B努力値配列input
3D努力値配列input
4合計努力値配列input
5H実数値output
6B実数値output
7D実数値output
8H-(B+D)calculate
9
10
上記の出力配列を8列目で昇順並べ替えを行い,絞ろ込みを行う。
絞り込みは以下表のレベルで行い,条件を満たす努力値配列を探し出す。

Lv.条件判定
5H=B+Dが誤差0で成立する-
4H=B+Dが誤差1で成立する-
3H=B+Dが誤差2で成立する-
2H=B+Dが誤差3で成立する-
1H=B+Dが誤差4で成立する-
0最小誤差を算出NG
※許容誤差の基準値は現在試験的に設定したものである
【コード:HeBD- Mode,データ処理】

【設計メモ】
・余談だが上記努力値パターンは312000ある,ひえーー
・余談だがベネディクト・カンバーバッチのイミテーション・ゲーム見ながら作ったので気分良く作れた笑
・input配列は初期立ち上げ時に計算する
→毎回計算するとめっさ時間食うん
・H=B+Dが成り立つケースが思ったよりないのか?
→絶対値の範囲をレベルごとで検討する
・理論式からHeBD-Modeの効果があるポケモンとないポケモンを算出できるかも
・プロットの方法
→HBのときDの情報をテキスト化,逆もしかり
・OpenDataを別で設立,HeBDの情報のみ出力(ついでにBC-Modeも作る)
・ほかモードと関連する詳しい解析は別記事で書いてもいいかもしれない



6.x1 あとがき

本記事は随時更新予定です。
なにかあればコメントまで

【関連記事】
【ポケモンMATLABダメ計】ダメージ補正リスト

【追加拡張機能メモ】
・Sについて
・HeBDの面積表示


6.x2 更新履歴

No.更新日時UpdateIndex
12019.12.28本記事公開
22019.12.30拡張機能"1on1-Mode"追加6.9(New)
拡張機能"RunningTest-Mode"追加6.10(New)
拡張機能"DamageKeeping-Mode"追加6.11(New)
拡張機能"BoundaryCalculatiton-Mode"追加6.12(New)
32020.01.09一部拡張機能への遷移をプルダウンに変更-
RT-Modeの詳細を追記6.10
BC-Modeの詳細を追記6.12
42020.01.11DLD-Modeの内容を修正6.9
1on1-Modeの内容を一部変更6.9
DK-Modeの詳細を追記6.11
52020.01.15HMBD-Modeの機能を追加6.8
RT-ModeのDB作成指針について追記6.10
拡張機能"ParameterSpecification-Mode"追加6.13(New)
拡張機能"HequelBD-Mode"追加6.14(New)
RT-Modeのスタートコードをfunc_08に格納-
62020.01.18BC-Modeメインコードをfunc_10に格納6.12
BC-ModeにopenDataコードを追記6.12
HeBD-Modeの詳細を追記6.14

コメント

このブログの人気の投稿

【ポケモンGO】愛知県名古屋市・鶴舞公園の歩き方

【ポケモンGO】種族値,実数値,CPを計算してみた話(おまけで全ポケモン種族値リスト)

【ポケモンMATLABダメ計】ダメージ補正リスト

【ポケモン】MATLABでダメージ計算ツールを作成するお話

【ポケモンBDSP】固定シンボル色違い自動厳選プログラムのデバッグ