Poke-Controllerの画像認識を利用した強化四天王周回自動化についての記事です。
前提として通常の強化四天王周回についても掲載しています。
強化四天王とは?
FRLGのポケモンリーグ(四天王+チャンピオン)は図鑑が60種以上の状態で殿堂入りもしくはオーキド博士に話しかけるとFRLGの追加シナリオが開始し、挑戦不能になります。
ネットワークマシンが完成する(『サファイア』をニシキに渡す)と再開し、手持ちが変化した通称「強化四天王」になります。
四天王は個体値ALL30、ライバルは個体値ALL31となっています。
トレーナーカードの自慢シール「殿堂入りの回数」を最大にするのに200回クリアが必要で攻略法が当時から研究されていました。
ファイアリーフ 自慢シールを極める
…が今回はRSEm未解禁。レックウザが使えません…。
(代わりに捕り放題のホウオウやファイアレッドならデオキシスAが使えるのでそれを利用する手もあるかも?)
なので今回はカイリューで行きます。
カイリューの能力を考える
・素早さ
ライバルのフーディンLv73:素早Vで202
ワタルのプテラLv70:素早Uで208
…だから素早さ209に…と思ってたんですが第三世代までバッジにステータス補正1.1倍があるので素早さ190になるよう振ればいいんですね…。
個体値25以上なら努力値を振らなくてOK。個体値が分からなければ性格S無補正で努力値S100振れば個体値0でも必ず190以上となります。
個体値測定&ステータス調整はつのぽけのツールが便利です。
tunopoke.sakura.ne.jp
・特攻
当然、性格補正ありで252振ります。
性格は「ひかえめ>おっとり=うっかりや」の3択です。
・攻撃
ヘラクロス対策の「そらをとぶ(命中95)」は性格「ひかえめ」でも1発落とせるので良いのですが、
最初にゼニガメを選んだ場合、ライバルがフシギバナを使うので威力を高めたいです(「ひかえめ」無振りだと「そらをとぶ」で半分削れない。その場合「ドラゴンクロー」連打にする)。
よって努力値配分はAC252がベストとなります。アンノーン(A1C1)を「薬0個+ギプス176匹」「薬20個+ギプス76匹」倒せばOKです。
「Lv100おっとり312-364-181-327-221-195」を使用して倒されて止まるパターンが多かったので『「そらをとぶ」はヘラクロス専用』として攻撃には振らず、耐久に振った方が良さそうです。
・HP
特攻252、素早さ190調整した残りを全て振るのがベストです。
今の所「Lv100ひかえめ360-266-203-328-234-209」を使用した時が安定性が高いです。
・厳選
【FR】スロット景品2800枚のLv18がれいせい以外で特攻30ならOK(個体値28以上、3/25*4/32=1.5%)
【LG】スロット景品4600枚のLv24がれいせい以外で特攻39ならOK(個体値30以上、3/25*2/32=0.75%)※38なら個体値25以上、3/25*7/32=2.63%
技の選択について
・カンナ
ジュゴン64がドラゴンクローでギリ落ちない。
ラプラス66がげきりんでギリ落ちない。
→基本10まんボルト、イノムー「なみのり」
・シバ
カイリキー/エビワラー65がなみのりで落ちない。
ハガネール66がドラゴンクローで落ちない。
→基本ドラゴンクロー、ハガネール*2は「なみのり」
・キクコ
→全部ドラゴンクローでOK
・ワタル
ギャラドスがドラゴンクローで落ちない。
→基本ドラゴンクローギャラドスは「10まんボルト」
・ライバル
ヘラクロス/バンギラス/フシギバナ/リザードンがドラゴンクローで落ちない。
→ヘラクロス/フシギバナは「そらをとぶ」、※フシギバナは初手「にほんばれ」なのでドラゴンクロー連打で良い
バンギラス/リザードンは「なみのり」、
フーディン/ウインディは「ドラゴンクロー」
※カメックスパターンは未調査
『おまもりこばん』やめて『りゅうのキバ』にすれば変わるんですが入手法がサファリのハクリュー捕獲しかないんですよね…。
プログラム
1drv.ms
「そらをとぶ」が失敗した場合リセットして再挑戦するように変更。
技選択→「たたかう」認識までA連打が上手くいってないので要調整。
ソースは以下。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-from Commands.PythonCommandBase import PythonCommand, ImageProcPythonCommand
from Commands.Keys import KeyPress, Button, Direction, Stick, Hatclass AutoEliteFour(ImageProcPythonCommand):
NAME = 'FRLG強化四天王周回'def __init__(self,cam):
super().__init__(cam)def do(self):
print("-------------------------------")
print("FRLG無限強化四天王周回【日本語版】")
print("Developed by えらー")
print("先頭はカイリュー「ドラゴンクロー」「10まんボルト」「そらをとぶ」「なみのり」")
print("")
print("ポケモンリーグ前で起動する事!")
print("-------------------------------")#先頭は「攻撃技(ノーマル・かくとう以外)」、2匹目は「あまいかおり」持ちとする事
#他5匹は問わない。〔ものひろい〕で無くてもいいが意味は無い。
count = 999 # 何戦毎に〔ものひろい〕回収するか?print("Start")
self.press(Button.B, 1.0, 0.5) # B
self.press(Button.B, 1.0, 0.5) # Bwhile True:
#ポケモンリーグ入り口→カンナ前
self.press(Hat.TOP, 3.7, 0) # ↑移動
self.press(Hat.LEFT, 1.8, 0) # ←移動
self.press(Hat.TOP, 5.9, 0) # ↑移動print("カンナ戦 開始")
self.press(Button.A, 0.1, 0.4) # A 会話開始
#「たたかう」が写るまでB連打。
while not self.isContainTemplate('FRLG_E4/battle.png', 0.9, use_gray=True, show_value=False):
self.press(Button.B, 0.1, 0.4) # Bボタンを押す
#HPバーが写っている限り以下を繰り返す
while self.isContainTemplate('FRLG_E4/moveframe.png', 0.9, use_gray=True, show_value=False):
self.press(Button.A, 0.1, 0.4) # A たたかう
# 状況から技選択
if self.isContainTemplate('FRLG_E4/Piloswine.png', 0.9, use_gray=True, show_value=False):# イノムーなら「なみのり」
self.press(Hat.RIGHT, 0.1, 0.3) # →カーソル移動
self.press(Hat.BTM, 0.1, 0.3) # ↓カーソル移動
print("なみのり")
else:
if self.isContainTemplate('FRLG_E4/Masako.png', 0.9, use_gray=True, show_value=False):# ルージュラなら「ドラゴンクロー」
self.press(Hat.LEFT, 0.1, 0.3) # ←カーソル移動
self.press(Hat.TOP, 0.1, 0.3) # ↑カーソル移動
print("ドラゴンクロー")
else:
self.press(Hat.RIGHT, 0.1, 0.3) # →カーソル移動
self.press(Hat.TOP, 0.1, 0.3) # ↑カーソル移動
print("10まんボルト")
#「たたかう」(2ターン目)又は主人公の背中(戦闘終了)が写るまでA連打。
while not(self.isContainTemplate('FRLG_E4/battle.png', 0.9, use_gray=True, show_value=False) or
self.isContainTemplate('FRLG_E4/gate.png', 0.9, use_gray=True, show_value=False) ):
self.press(Button.A, 0.1, 0.9) # Aボタンを押す※間隔が早いと検知できない0.7x 0.8oprint("カンナ戦 終了")
self.press(Button.B, 0.1, 0.4) # Bボタンを押す
#メッセージが写っている限り以下を繰り返す
while self.isContainTemplate('FRLG_E4/message.png', 0.9, use_gray=True, show_value=False):
self.press(Button.B, 0.1, 0.4) # Bボタンを押す
#カンナ→シバ前
self.press(Hat.LEFT, 0.3, 0) # ←移動
self.press(Hat.TOP, 0.5, 0) # ↑移動
self.press(Hat.RIGHT, 0.3, 0) # ←移動
self.press(Hat.TOP, 4.0, 0) # ↑移動
print("シバ戦 開始")
self.press(Button.A, 0.1, 0.4) # A 会話開始
#「たたかう」が写るまでB連打。
while not self.isContainTemplate('FRLG_E4/battle.png', 0.9, use_gray=True, show_value=False):
self.press(Button.B, 0.1, 0.4) # Bボタンを押す
#HPバーが写っている限り以下を繰り返す
while self.isContainTemplate('FRLG_E4/moveframe.png', 0.9, use_gray=True, show_value=False):
self.press(Button.A, 0.1, 0.4) # A たたかう
# 状況から技選択
if self.isContainTemplate('FRLG_E4/Steelix.png', 0.9, use_gray=True, show_value=False):# ハガネールなら「なみのり」
self.press(Hat.RIGHT, 0.1, 0.3) # →カーソル移動
self.press(Hat.BTM, 0.1, 0.3) # ↓カーソル移動
print("なみのり")
else:
self.press(Hat.LEFT, 0.1, 0.3) # ←カーソル移動
self.press(Hat.TOP, 0.1, 0.3) # ↑カーソル移動
print("ドラゴンクロー")
#「たたかう」(2ターン目)又は主人公の背中(戦闘終了)が写るまでA連打。
while not(self.isContainTemplate('FRLG_E4/battle.png', 0.9, use_gray=True, show_value=False) or
self.isContainTemplate('FRLG_E4/gate.png', 0.9, use_gray=True, show_value=False) ):
self.press(Button.A, 0.1, 0.9) # Aボタンを押す※間隔が早いと検知できない0.7xprint("シバ戦 終了")
self.press(Button.B, 0.1, 0.4) # Bボタンを押す
#メッセージが写っている限り以下を繰り返す
while self.isContainTemplate('FRLG_E4/message.png', 0.9, use_gray=True, show_value=False):
self.press(Button.B, 0.1, 0.4) # Bボタンを押す
#シバ→キクコ前
self.press(Hat.LEFT, 0.3, 0) # ←移動
self.press(Hat.TOP, 0.5, 0) # ↑移動
self.press(Hat.RIGHT, 0.3, 0) # →移動
self.press(Hat.TOP, 4.0, 0) # ↑移動
print("キクコ戦 開始")
self.press(Button.A, 0.1, 0.4) # A 会話開始
#「たたかう」が写るまでB連打。
while not self.isContainTemplate('FRLG_E4/battle.png', 0.9, use_gray=True, show_value=False):
self.press(Button.B, 0.1, 0.4) # Bボタンを押す
#HPバーが写っている限り以下を繰り返す
while self.isContainTemplate('FRLG_E4/moveframe.png', 0.9, use_gray=True, show_value=False):
self.press(Button.A, 0.1, 0.4) # A たたかう
print("ドラゴンクロー")
#「たたかう」(2ターン目)又は主人公の背中(戦闘終了)が写るまでA連打。
while not(self.isContainTemplate('FRLG_E4/battle.png', 0.9, use_gray=True, show_value=False) or
self.isContainTemplate('FRLG_E4/gate.png', 0.9, use_gray=True, show_value=False) ):
self.press(Button.A, 0.1, 1.5) # Aボタンを押す※間隔が早いと検知できない0.9xprint("キクコ戦 終了")
self.press(Button.B, 0.1, 0.4) # Bボタンを押す
#メッセージが写っている限り以下を繰り返す
while self.isContainTemplate('FRLG_E4/message.png', 0.9, use_gray=True, show_value=False):
self.press(Button.B, 0.1, 0.4) # Bボタンを押す
#キクコ→ワタル前
self.press(Hat.LEFT, 0.3, 0) # ←移動
self.press(Hat.TOP, 0.5, 0) # ↑移動
self.press(Hat.RIGHT, 0.3, 0) # →移動
self.press(Hat.TOP, 2.4, 8.8) # ↑移動&待機
self.press(Hat.TOP, 0.6, 0) # ↑移動
print("ワタル戦 開始")
self.press(Button.A, 0.1, 0.4) # A 会話開始
#「たたかう」が写るまでB連打。
while not self.isContainTemplate('FRLG_E4/battle.png', 0.9, use_gray=True, show_value=False):
self.press(Button.B, 0.1, 0.4) # Bボタンを押す
#HPバーが写っている限り以下を繰り返す
while self.isContainTemplate('FRLG_E4/moveframe.png', 0.9, use_gray=True, show_value=False):
self.press(Button.A, 0.1, 0.4) # A たたかう
# 状況から技選択
if self.isContainTemplate('FRLG_E4/Gyarados.png', 0.9, use_gray=True, show_value=False):# ギャラドスなら「10まんボルト」
self.press(Hat.RIGHT, 0.1, 0.3) # →カーソル移動
print("10まんボルト")
else:
self.press(Hat.LEFT, 0.1, 0.3) # ←カーソル移動
print("ドラゴンクロー")
#「たたかう」(2ターン目)又は主人公の背中(戦闘終了)が写るまでA連打。
while not(self.isContainTemplate('FRLG_E4/battle.png', 0.9, use_gray=True, show_value=False) or
self.isContainTemplate('FRLG_E4/gate.png', 0.9, use_gray=True, show_value=False) ):
self.press(Button.A, 0.1, 1.5) # Aボタンを押す※間隔が早いと検知できない0.7xprint("ワタル戦 終了")
self.press(Button.B, 0.1, 0.4) # Bボタンを押す
#メッセージが写っている限り以下を繰り返す
while self.isContainTemplate('FRLG_E4/message.png', 0.9, use_gray=True, show_value=False):
self.press(Button.B, 0.1, 0.4) # Bボタンを押す
#ワタル→ライバル前
self.press(Hat.LEFT, 0.3, 0) # ←移動
self.press(Hat.TOP, 0.5, 0) # ↑移動
self.press(Hat.RIGHT, 0.3, 0) # →移動
self.press(Hat.TOP, 1.9, 0) # ↑移動
print("ライバル戦 開始")
self.press(Button.A, 0.1, 0.4) # A 会話開始
#「たたかう」が写るまでB連打。
while not self.isContainTemplate('FRLG_E4/battle.png', 0.9, use_gray=True, show_value=False):
self.press(Button.B, 0.1, 0.4) # Bボタンを押す
#HPバーが写っている限り以下を繰り返す
while self.isContainTemplate('FRLG_E4/moveframe.png', 0.9, use_gray=True, show_value=False):
self.press(Button.A, 0.1, 0.4) # A たたかう
# 状況から技選択
if (self.isContainTemplate('FRLG_E4/Tyranitar.png', 0.9, use_gray=True, show_value=False) or
self.isContainTemplate('FRLG_E4/Charizard.png', 0.9, use_gray=True, show_value=False)):# バンギラスかリザードンなら「なみのり」
self.press(Hat.RIGHT, 0.1, 0.3) # →カーソル移動
self.press(Hat.BTM, 0.1, 0.3) # ↓カーソル移動
print("なみのり")
else:
if self.isContainTemplate('FRLG_E4/Gyarados.png', 0.9, use_gray=True, show_value=False):# ギャラドスなら「10まんボルト」
self.press(Hat.RIGHT, 0.1, 0.3) # →カーソル移動
self.press(Hat.TOP, 0.1, 0.3) # ↑カーソル移動
print("10まんボルト")
else:
if self.isContainTemplate('FRLG_E4/Heracross.png', 0.9, use_gray=True, show_value=False):# ヘラクロスなら「そらをとぶ」
self.press(Hat.LEFT, 0.1, 0.3) # ←カーソル移動
self.press(Hat.BTM, 0.1, 0.3) # ↓カーソル移動
print("そらをとぶ")
else:
self.press(Hat.LEFT, 0.1, 0.3) # ←カーソル移動
self.press(Hat.TOP, 0.1, 0.3) # ↑カーソル移動
print("ドラゴンクロー")
#「たたかう」(2ターン目)又は主人公の背中(戦闘終了)が写るまでA連打。
while not(self.isContainTemplate('FRLG_E4/battle.png', 0.9, use_gray=True, show_value=False) or
self.isContainTemplate('FRLG_E4/message.png', 0.9, use_gray=True, show_value=False) ):
self.press(Button.A, 0.2, 1.5) # Aボタンを押す※間隔が早いと検知できない0.9x
print("ライバル戦 終了")
for battle in range(205): #41秒間A連打
self.press(Button.A, 0.1, 0.1) # Aボタンを押す#リーグに居なければリセットからやり直す
while not self.isContainTemplate('FRLG_E4/league.png', 0.9, use_gray=True, show_value=False):
#リセット
print("リセットします")
self.press([Button.A, Button.B, Button.X, Button.Y], 1.0, 1.0)
for battle in range(55): #11秒間A連打
self.press(Button.A, 0.1, 0.1) # Aボタンを押す
#自宅前→ポケモンリーグ
print("ポケモンリーグに")
self.press(Button.X, 0.1, 0.4) # Xメニューを開く
self.press(Hat.BTM, 0.1, 0.3) # ↓カーソル移動
self.press(Button.A, 0.1, 1.1) # Aポケモンを開く
#self.press(Hat.BTM, 0.1, 0.3) # ↓カーソル移動 【2匹目で「そらをとぶ」版】self.press(Button.A, 0.1, 0.3) # Aつよさをみる
self.press(Hat.BTM, 0.1, 0.3) # ↓カーソル移動
self.press(Button.A, 0.1, 1.5) # Aマップへ
self.press(Hat.LEFT, 0.12, 0) # ←カーソル移動
self.press(Hat.TOP, 0.71, 0) # ↑カーソル移動
self.press(Button.A, 0.1, 0.3) # A実行
self.press(Button.A, 0.1, 0.3) # A実行
self.press(Hat.RIGHT, 0.05, 0) # 失敗してたら→カーソル移動
self.press(Button.A, 0.1, 0.3) # A再実行
self.press(Button.A, 0.1, 0.3) # A再実行
self.press(Button.B, 0.1, 8.0) # B失敗してたらもう一回
print("飛びます")# 道具回収
if(count <= 5):# <=0 で回収、~-1で回収しない
print("〔ものひろい〕回収")
self.press(Button.X, 0.1, 0.4) # Xメニューを開く
self.press(Button.A, 0.1, 1.3) # Aポケモンを開く#1匹目
#何もしない
#2匹目
self.press(Hat.BTM, 0.1, 0.4) # ↓カーソル移動
#「あまいかおり」役なので何もしない
#3匹目
self.press(Hat.BTM, 0.1, 0.4) # ↓カーソル移動
if( self.isContainTemplate('FRLG_item.png', 0.9, use_gray=False, show_value=False)):
self.press(Button.A, 0.1, 0.4) # Aつよさをみる
self.press(Hat.TOP, 0.1, 0.3) # ↑カーソル移動(やめる)
self.press(Hat.TOP, 0.1, 0.3) # ↑カーソル移動(もちもの)
self.press(Button.A, 0.1, 0.4) # Aバッグをひらく
self.press(Hat.BTM, 0.1, 0.3) # ↓カーソル移動(バッグへもどす or やめる
self.press(Button.A, 0.1, 0.9) # Aあずかりました! or もっていません!
self.press(Button.B, 0.1, 0.4) # B選択終了
#4匹目
self.press(Hat.BTM, 0.1, 0.4) # ↓カーソル移動
if( self.isContainTemplate('FRLG_item.png', 0.9, use_gray=False, show_value=False)):
self.press(Button.A, 0.1, 0.4) # Aつよさをみる
self.press(Hat.TOP, 0.1, 0.3) # ↑カーソル移動(やめる)
self.press(Hat.TOP, 0.1, 0.3) # ↑カーソル移動(もちもの)
self.press(Button.A, 0.1, 0.4) # Aバッグをひらく
self.press(Hat.BTM, 0.1, 0.3) # ↓カーソル移動(バッグへもどす or やめる
self.press(Button.A, 0.1, 0.9) # Aあずかりました! or もっていません!
self.press(Button.B, 0.1, 0.4) # B選択終了
#5匹目
self.press(Hat.BTM, 0.1, 0.4) # ↓カーソル移動
if( self.isContainTemplate('FRLG_item.png', 0.9, use_gray=False, show_value=False)):
self.press(Button.A, 0.1, 0.4) # Aつよさをみる
self.press(Hat.TOP, 0.1, 0.3) # ↑カーソル移動(やめる)
self.press(Hat.TOP, 0.1, 0.3) # ↑カーソル移動(もちもの)
self.press(Button.A, 0.1, 0.4) # Aバッグをひらく
self.press(Hat.BTM, 0.1, 0.3) # ↓カーソル移動(バッグへもどす or やめる
self.press(Button.A, 0.1, 0.9) # Aあずかりました! or もっていません!
self.press(Button.B, 0.1, 0.4) # B選択終了
#6匹目
self.press(Hat.BTM, 0.1, 0.4) # ↓カーソル移動
if( self.isContainTemplate('FRLG_item.png', 0.9, use_gray=False, show_value=False)):
self.press(Button.A, 0.1, 0.4) # Aつよさをみる
self.press(Hat.TOP, 0.1, 0.3) # ↑カーソル移動(やめる)
self.press(Hat.TOP, 0.1, 0.3) # ↑カーソル移動(もちもの)
self.press(Button.A, 0.1, 0.4) # Aバッグをひらく
self.press(Hat.BTM, 0.1, 0.3) # ↓カーソル移動(バッグへもどす or やめる
self.press(Button.A, 0.1, 0.9) # Aあずかりました! or もっていません!
self.press(Button.B, 0.1, 0.4) # B選択終了self.press(Button.B, 0.1, 1.3) # Bメニューに戻る
self.press(Button.B, 0.1, 0.8) # Bメニューを閉じる
count = 5 # 初期値に戻す