UWSCを使ってPS版ドラクエ7を自動化してみた

Tips

はじめに

※2025/12/07追記:改良版のスクリプトをこちらで公開しました。
本記事はChkImgX関数を使ったサンプルとして残しておきます。

プレイステーション版『ドラゴンクエスト7』は、シリーズの中でも特に長大なシナリオとボリュームを誇る作品です。
その一方で、やり込みを極めようとすると「熟練度稼ぎ」や「種集め」といった単純作業に多くの時間を取られてしまいます。

そこで今回は、Windows上で動作する自動化ツール UWSC を活用し、エミュレータ上で戦闘を自動化するスクリプトを作ってみました。
UWSC自体の導入や基本的な使い方については、前回の記事をご参照ください。

PS版ドラクエ7向け自動戦闘スクリプト

前提環境

今回のスクリプトを動かすための環境は以下の通りです。

  • エミュレータ:DuckStation
  • UWSC:最新版(フリー版でOK)

また、UWSCで ChkImgX関数 を利用する必要があります。
導入手順については以下のページを参照してください。
👉 ChkImgX関数 – UWSC辞典

なお、エミュレータはDuckStation以外でも、PS版ドラクエ7が正常に動作するものであれば問題ありません。

自動戦闘スクリプトの概要

今回の自動戦闘スクリプトは、以下の流れで動作します。

  1. フィールドで「くちぶえ」を使用して強制的に戦闘へ突入
  2. 戦闘画面で「たたかう」を自動選択
  3. 戦闘中は〇ボタンを連打
  4. 戦闘終了を判定し、フィールド画面に戻ったら一時待機
  5. 上記を繰り返し実行

これにより、経験値稼ぎや熟練度上げ、アイテムドロップ狙いなどを放置で進められるようになります。

実際のスクリプト

// ChkImgX関数をインクルード
CALL ChkImgX.uws

// ▼ パラメータ
DIM sleepTime_KeySend = 0.002
DIM sleepTime_BattleEnd = 0.1

// ▼ 対象ウィンドウ取得
DIM id = GETID("ドラゴン・クエストⅦ ~エデンの戦士たち~ (DISC 2)", "Qt6101QWindowIcon")
DIM x1 = STATUS(id, ST_X)
DIM y1 = STATUS(id, ST_Y)
DIM x2 = x1 + STATUS(id, ST_CLWIDTH)
DIM y2 = y1 + STATUS(id, ST_CLHEIGHT)

// ▼ CHKIMGX設定
DIM similarity = 9
DIM color = "$000000"

// ▼ キー定義
DIM keyCircle = VK_Z
DIM keyRight = VK_RIGHT

// アクティブ化
ACW(id)

WHILE TRUE

    // ---------------------------------
    // ▼ 戦闘前:メニュー → 特技 → キャラ選択 → くちぶえ
    // ---------------------------------
    KBD_Press(keyCircle, sleepTime_KeySend)          // メニュー
    KBD_Press(keyRight,  sleepTime_KeySend)          // 特技へ
    KBD_Press(keyCircle, sleepTime_KeySend)          // 特技を開く
    KBD_Press(keyCircle, sleepTime_KeySend)          // キャラ選択
    KBD_Press(keyCircle, sleepTime_KeySend)          // くちぶえ使用

    // ---------------------------------
    // ▼ 戦闘中:○連打 → 戦闘終了検出
    // ---------------------------------
    STARTUP_CHKIMGX()
    REPEAT
        KBD_Press(keyCircle, sleepTime_KeySend)
    UNTIL Func_IsBattleEnd(x1, y1, x2, y2, similarity, color)
    SHUTDOWN_CHKIMGX()

    // ---------------------------------
    // ▼ 戦闘終了
    // ---------------------------------
    SLEEP(sleepTime_BattleEnd)

WEND

// ▼ 関数:キー押下(DOWN → SLEEP → UP)
PROCEDURE KBD_Press(key, sleepTime_KeySend)
    KBD(key, DOWN)
    SLEEP(sleepTime_KeySend)
    KBD(key, UP)
FEND

// ▼ 関数:戦闘終了画像チェック
FUNCTION Func_IsBattleEnd(x1, y1, x2, y2, similarity, color)
    RESULT = CHKIMGX("dq7_nomal.png",0,x1,y1,x2,y2,0,similarity,color)  OR _
             CHKIMGX("dq7_steal.png",0,x1,y1,x2,y2,0,similarity,color)  OR _
             CHKIMGX("dq7_drop.png" ,0,x1,y1,x2,y2,0,similarity,color)
FEND

〇ボタンはキーボードの「Z(VK_Z)」に設定しております。
キーを押している間隔は「sleepTime_KeySend」で制御しています。
また戦闘終了時は「sleepTime_BattleEnd」分のスリープ時間を入れております。

戦闘終了判定は、エミュレータ画面に表示される以下の画像を曖昧検索で検出することで行っています。
<dq7_nomal.png>

<dq7_drop.png>

<dq7_steal.png>

おわりに

実際にスクリプトを動かしてみたところ、しっかりと戦闘を自動でこなしてくれました。
特に熟練度稼ぎや種集めの効率が大幅に向上し、単純作業から解放されるのは非常に快適です。

UWSCはシンプルながら強力な自動化ツールで、ゲームの効率化にも十分活用できます。
今回紹介したのはあくまで一例ですが、判定条件や入力パターンを工夫すれば、より高度な自動化も可能です。

チートを使わず、「自動化で楽をする」スタイルに共感できる方は、ぜひ試してみてください。

コメント