2021-01-24

SikuliXの勉強 FFRK ラビリンスダンジョン自動化実験

SikuliXの勉強のため、FFRK(FINAL FANTASY Record Keeper)のラビリンスダンジョンの操作を自動化してみました。いろいろ課題はありますが、以前投稿した汎用スクリプトで自動操作できました。

スクリプト

スクリプトは以前の汎用スクリプトそのまま。

Settings.MinSimilarity = 0.80
Settings.MoveMouseDelay = 0
Settings.ClickDelay = 0.4

IMGS = [
]

reg = Region(App.focusedWindow())
reg.highlight(1,"green")

while True:
	ms = reg.findAnyList(IMGS) 
	for m in ms:
		m.click()
		break
	sleep(0.5)


動作

使い方はIMGSに操作対象の画像を登録していくのみ。

同じ画面に複数の検索対象がある場合は、画像の並びを調整することで対応できました。

実際の流れは以下の動作を参照。



課題

現状のスクリプトでは1場面1クリックを想定しており、クリックすると場面が変わりクリックした画像がなくなる事を期待しています。なくならず残り続けるシーンだと永遠にその画像をクリックし続ける動きになります。

このため、1つの場面でクリック対象を順番に切り替えるような場面はやり方を考えなければなりません。

今回のFFRKの場合は、出撃するパーティを選択するシーンになります。一番消耗していないパーティを選択した後、Goボタンをクリックする処理になります。

クリックした画像の情報を残す(フラグを立てる)など実装すると実現可能ですが、コードが複雑化しそうです。

より簡単かつすっきりする方法を検討したいと思います。


5 件のコメント:

  1. このスプリクトを参考にウマ娘のフレポ自動周回を設定してみたのですがNOX同期させると段々追い付かなくなり挙動がずれますモニターを全画面に判定させることはできますか?

    返信削除
  2. 以下でフォーカスが当たったウインドウの範囲を検索対象にしています。
    reg = Region(App.focusedWindow())

    これを、SikulixのRegionボタンなどで画面全体を指定すると、全体が検索範囲になります。
    reg = Region(0,0,1920,1080)

    返信削除
  3. 記事を参考にラビダン周回できるようになりました。感謝です。
    ところで、出撃パーティー選択についてですが、IMGS_PARTYという配列に摩耗度の数値のみの画像を0から昇順に格納しておいて、ループの中身を
    mp = reg.findAnyList(IMGS_PARTY)
    for m in mp:
    m.click()
    ms = reg.findAnyList(IMGS)
    for m in ms:
    m.click()
    このようにすればできないですかね?摩耗度の数値の画像を0から10まで揃えるのが面倒で試してないですがw

    あと、Sleep(0.5)の位置はBreakの後でいいんですか?
    Python素人なのでよくわからないのですが、
    Sleepする前にループしちゃってるような気がしてしまいます。

    返信削除
    返信
    1. Breakについては自己解決しました。for文のループを抜けた後、while文のループ最後にBreakしているんですもんね。おバカなことを言ってすみません。

      削除
    2. 摩耗度の画像が揃ったので以下のように実装してみました。
      摩耗度の低いパーティーを選択して出撃することができました。
      報告まで。

      while True:
      #出撃パーティー選択画面において、一番少ない摩耗度をクリック
      mm = reg.findAnyList(IMGS_MAMOU)
      for m in mm:
      #最初に見つかった最低摩耗度をクリックして完了
      m.click()
      break

      #ラビダン画面遷移時の要素クリック
      ms = reg.findAnyList(IMGS)
      for m in ms:
      #最初に見つかった要素をクリックして完了
      m.click()
      break

      #ループ時のスリープ時間設定
      sleep(1)

      削除