2020/02/28 追記
完成しました!
前回は耐久調整APIを作成しました。
今回は素早さ努力値調整APIを作成します。
というかしました。
素早さ調整は耐久調整と違って単純に数値比較するだけなので楽に実装できる・・・
と思いきや中々に苦戦しました。
ポケモン剣盾用の耐久努力値調整ツールを作成しました! ぜひ使ってみてください!
前回のあらすじ
要件
前回と同じく、POSTでjsonを送って、その内容を処理して返却。
その部分は変更なしですね。
POSTする内容
- 自分のポケモン
- 仮想敵ポケモン
- フィールド情報(天候やエレキ、おいかぜ等)
返却される情報
- 自分のポケモンの情報(調整結果)
コード
前回と全く一緒です。
@app.route('/speed', methods=['POST']) def calcSpeedEff(): if request.method == 'POST': params = request.json response = {} ~~~ 計算をする処理(省略) ~~~ return response
・・・では色気ないので、計算処理の部分もちょっと公開。
def calcSpeedAdjust(_myStatus, _enemyStatus, _myField, _enemyField, _diffPoint = 1, _adjType = 0): myPk = _myStatus # 自分ポケモンの努力値を分解したもの hEff = myPk.pokeEffortStats[0] aEff = myPk.pokeEffortStats[1] bEff = myPk.pokeEffortStats[2] cEff = myPk.pokeEffortStats[3] dEff = myPk.pokeEffortStats[4] sEff = myPk.pokeEffortStats[5] myEff = [hEff, aEff, bEff, cEff, dEff, sEff] msg = '' # 仮想的の素早さ実値 enemyS = calcPokeStatus.getPokemonSpeed(_enemyStatus, _enemyField) # 無限ループ while True: # 自分のポケモンの素早さ実値 myPk = calcPokeStats(myPk.pokeNameJP, myPk.pokeNature, myPk.pokeLevel, myPk.pokeGender, \ myPk.pokeAbility, [hEff, aEff, bEff, cEff, dEff, sEff], myPk.pokeIndvStats, \ myPk.pokeStatsRank, myPk.pokeItem, myPk.pokeCondition, myPk.pokeMinimize, myPk.pokeDymax) myS = calcPokeStatus.getPokemonSpeed(myPk, _myField) print(myS, enemyS, myPk.pokeEffortStats) # 素早さ比較(_diffPointが0なら同速、1なら抜き、2なら抜き抜き調整となる) if myS >= enemyS + _diffPoint: myEff = [hEff, aEff, bEff, cEff, dEff, sEff] return [myEff, msg] # 252より小さいなら4を足して再計算 # 252以上なら抜けないという結果を返す if sEff < 252: sEff += 4 else: msg += '努力値を252にしても調整不可です\n' myEff = [hEff, aEff, bEff, cEff, dEff, -1] return [myEff, msg]
引数は(自ポケ情報, 相手ポケ情報, 自フィールド情報, 相手フィールド情報,差)
です。
今回は試験的にデフォルト引数ってやつを使ってみました。
これを使うと引数を省略できる優れもの。
素早さ実数値の計算ロジック部分はこちら。
def getPokemonSpeed(_poke, _field): baseS = _poke.pokeStats[5] resS = baseS ##ランク補正 x = 2 y = 2 if _poke.pokeStatsRank[5] > 0: x += _poke.pokeStatsRank[5] elif _poke.pokeStatsRank[5] <= 0: y -= _poke.pokeStatsRank[5] resS = math.floor(resS * (x / y)) ##各特性補正 if _poke.pokeAbility == 'すいすい' and _field.weather == '雨': resS = math.floor(resS * 2.0) elif _poke.pokeAbility == 'ようりょくそ' and _field.weather == '晴': resS = math.floor(resS * 2.0) elif _poke.pokeAbility == 'すなかき' and _field.weather == '砂嵐': resS = math.floor(resS * 2.0) elif _poke.pokeAbility == 'ゆきかき' and _field.weather == '霰': resS = math.floor(resS * 2.0) elif _poke.pokeAbility == 'サーフテール' and _field.field == 'エレキ': resS = math.floor(resS * 2.0) elif _poke.pokeAbility == 'はやあし': if _pokepokeCondition == 'やけど' or _pokepokeCondition == 'どく' or _pokepokeCondition == 'まひ' or _pokepokeCondition == 'ねむり' or _pokepokeCondition == 'こおり': resS = math.floor(resS * 1.5) elif _poke.pokeAbility == 'かるわざ': resS = math.floor(resS * 2.0) elif _poke.pokeAbility == 'スロースタート': resS = math.floor(resS * 0.5) ##持ち物補正 if _poke.pokeItem == 'こだわりスカーフ': resS = math.floor(resS * 1.5) elif _poke.pokeItem == 'メタルパウダー' and _poke.pokeNameJP == 'メタモン': resS = math.floor(resS * 2.0) elif _poke.pokeItem == 'くろいてっきゅう': resS = math.floor(resS * 0.5) elif _poke.pokeItem == 'きょうせいギプス': resS = math.floor(resS * 0.5) elif _poke.pokeItem == 'パワーウエイト': resS = math.floor(resS * 0.5) elif _poke.pokeItem == 'パワーリスト': resS = math.floor(resS * 0.5) elif _poke.pokeItem == 'パワーベルト': resS = math.floor(resS * 0.5) elif _poke.pokeItem == 'パワーレンズ': resS = math.floor(resS * 0.5) elif _poke.pokeItem == 'パワーバンド': resS = math.floor(resS * 0.5) elif _poke.pokeItem == 'パワーアンクル': resS = math.floor(resS * 0.5) #おいかぜ補正 if _field.tailwind: resS = math.floor(resS * 2.0) ##状態異常 if _poke.pokeCondition == 'まひ' and _poke.pokeAbility != 'はやあし': resS = math.floor(resS * 0.5) return resS
素早さ補正の順番は
- ランク補正
- 特性補正
- 持ち物補正
- 追い風補正
- 麻痺補正
の順番に計算してますが、これが合っているのかは不明・・・
一応、ポケモン徹底攻略様やその他素早さ計算ツールを公開しているサイトを参考にして、こうではないかという結論を出してはいますが、検証してみないとわからんすね。
都度切り捨て処理が走る(と思われる)ので、計算順番が狂うと結果も違ってきてしまうんですよね。
特に素早さは1の差がめちゃくちゃ重要なので間違えてはいけない部分。
間違ってたらご指摘ください・・
JSON
POST
ポストするjsonはこんな感じ。
{ "speed":{ "adjustType":0, "diffPoint":1, "myPokemon":{ "pkName":"バンギラス", "pkNature":"ようき", "pkLevel":50, "pkGender":1, "pkAbility":"すなおこし", "pkEff":{ "h":0, "a":0, "b":0, "c":0, "d":0, "s":0 }, "pkIndv":{ "h":31, "a":31, "b":31, "c":31, "d":31, "s":31 }, "pkRank":{ "h":0, "a":0, "b":0, "c":0, "d":0, "s":0 }, "pkItem":"", "pkCond":"", "pkMini":false, "pkDymax":false, "fTailwind":false }, "enemyPokemon":{ "pkName":"トゲキッス", "pkNature":"ひかえめ", "pkLevel":50, "pkGender":2, "pkAbility":"てんのめぐみ", "pkEff":{ "h":252, "a":0, "b":0, "c":252, "d":0, "s":6 }, "pkIndv":{ "h":31, "a":31, "b":31, "c":31, "d":31, "s":31 }, "pkRank":{ "h":0, "a":0, "b":0, "c":0, "d":0, "s":0 }, "pkItem":"いのちのたま", "pkCond":"", "pkMini":false, "pkDymax":false, "fTailwind":false }, "field":{ "fWeather":"砂嵐", "fField":"", "fWaterSport":false, "fMudSport":false, "fLightScreen":false, "fReflect":false, "fHelpingHand":false, "fMeFirst":false, "fCharge":false, "fBattery":false, "fSteelySpirit":false, "fFriendGurd":false, "fDoubleBattle":false } } }
陽気バンギがS6振りトゲキッスを抜く努力値を計算する用のjsonです。
またまたよくわからない構造になってますが、まあ前回よりは簡単になっているでしょう。
正直自分用のメモとしての側面が強いので、理解してもらおうとは思ってない・・・
もしAPIを公開するときはちゃんと仕様書を作ろうと思います・・・。
出力結果
こんな感じに帰ってきます。

{ "msg": "", "myPokemon": { "pkAbility": "すなおこし", "pkCond": "", "pkDymax": false, "pkEff": { "a": 0, "b": 0, "c": 0, "d": 0, "h": 0, "s": 92 }, "pkGender": 1, "pkIndv": { "a": 31, "b": 31, "c": 31, "d": 31, "h": 31, "s": 31 }, "pkItem": "", "pkLevel": 50, "pkMini": false, "pkName": "バンギラス", "pkNature": "ようき", "pkStat": { "a": 154, "b": 130, "c": 103, "d": 120, "h": 175, "s": 102 } } }
今回は、Sに92振れば陽気バンギ>S6キッスになるようです。
ダメ系がいらないので複雑な処理は必要なさそうですね。
抜かれ調整、とかになるとちょっとめんどいですが・・・
まとめ
例のごとくローカル環境でのAPIだし、未実装の計算も多いですが、耐久調整に続き素早さ調整のAPIも構築完了しました。
あとは攻撃調整APIが完成すればミッションの半分は達成できそうですね。
あとは早く載せる鯖を調達しないと・・・
さくらVPSの2週間無料とか試してみようかな・・・
コメント