LinSoap

LinSoap

Null
github
x

Linuxでも明日方舟でワンクリック収穫

最近 Windows から Manjaro システムに全面的に移行しましたが、本当に使いやすいです。Manjaro に移行した後の重要な問題は、以前のように MAA 明日方舟の収穫を多重に行う方法です。結局、粥批は毎日 2 回収穫しなければならず、複数のアカウントを手動で収穫するのは非常に面倒です。

エミュレーター#

まず、MAA は 3 種類の Linux エミュレーターをサポートしています。1 つは AVD、もう 1 つは Waydroid、最後の 1 つは redroid です。私は AVD を使用することにしました。結局、Google のサポートがあるので、相対的に使いやすいです。Waydroid のコンテナ化の概念は良いですが、N カードに対するサポートがないようです。
AVD は android-studio に統合されており、まず AUR リポジトリから android-studio をダウンロードします(flatpak リポジトリは使用しないでください。コンテナ化により、後続のコマンドラインでエミュレーターを起動するのが非常に面倒になります)。プロキシを設定して Sdk をダウンロードした後、選択します。

virtualdevice

もちろん、android-studio を使用せずに直接 AVD を使用することもできますが、android-studio はグラフィカルインターフェースを提供しているため、多くの手間を省くことができます。
新しいデバイスを作成し、解像度を 16:9 に設定し、720p 以上にします。フレームワークは (R - 30 - x86 - Android 11.0) を選択し、自分の構成に応じて各エミュレーターに適切な構成を割り当てます。ハードウェアアクセラレーションを有効にすることを忘れずに、これで MAA をサポートするエミュレーターが成功裏に作成され、adb を通じて明日方舟をインストールできます。

newdevice

selectimage

detailsetting

毎回エミュレーターを開くたびに android-studio を開くのは非常に面倒ですが、実際にはコマンドラインからエミュレーターを直接開くことができます。

~/Android/Sdk/emulator/emulator -list-avds //エミュレーターリストを取得
~/Android/Sdk/emulator/emulator -avd エミュレーター名 //指定したエミュレーターを起動 

MAA 設定#

MAA を公式サイトからダウンロードして解凍した後、公式は MAA を呼び出すためのいくつかの方法を提供しています。1 つは maa-cli、もう 1 つは Python インターフェースで、それぞれ解凍パッケージのルートディレクトリにある AppImage ファイルと Python フォルダーです。maa-cli の設定を見てみましたが、タスクの設定や多重起動は非常に面倒なので、Python インターフェースを使用して MAA を起動することにしました。Python フォルダー内の sample.py ファイルを開き、このファイルを変更することでタスク設定を完了できます。まず、adb のアドレスと adb デバイス名を設定し、その後、必要に応じてドキュメントに従ってタスクを追加し、タスクパラメーターを設定します。直接 python sample.py を実行すれば、すぐに収穫を開始できます。
タスクのたびに py ファイルを変更するのは非常に面倒なので、python を実行する際に引数を受け取ることができ、実行するタスクを選択できます。この sample ファイルを変更し、以下に私のタスク設定を示します。

import json
import pathlib
import time
import argparse

from asst.asst import Asst
from asst.utils import Message, Version, InstanceOptionType
from asst.updater import Updater
from asst.emulator import Bluestacks

@Asst.CallBackType
def my_callback(msg, details, arg):
    m = Message(msg)
    d = json.loads(details.decode('utf-8'))

    print(m, d, arg)

if __name__ == "__main__":
    # ArgumentParserオブジェクトを作成
    parser = argparse.ArgumentParser(description='Arknights Assistant Script')

    # 各タスクの有効化オプションを追加
    parser.add_argument('--start-up', action='store_true', help='StartUpタスクを有効にする')
    parser.add_argument('--recruit', action='store_true', help='Recruitタスクを有効にする')
    parser.add_argument('--infrast', action='store_true', help='Infrastタスクを有効にする')
    parser.add_argument('--visit', action='store_true', help='Visitタスクを有効にする')
    parser.add_argument('--mall', action='store_true', help='Mallタスクを有効にする')
    parser.add_argument('--fight', action='store_true', help='Fightタスクを有効にする')
    parser.add_argument('--award', action='store_true', help='Awardタスクを有効にする')
    parser.add_argument('--stage', type=str, default=None, help='Fightタスクのステージを指定')

    args = parser.parse_args()

    # dllファイルとリソースを格納するパスを設定してください
    path = pathlib.Path(__file__).resolve().parent.parent

    # アップデーターのパスとターゲットバージョンを設定し、更新
    # Updater(path, Version.Stable).update()

    Asst.load(path=path)

    asst = Asst()

    asst.set_instance_option(InstanceOptionType.touch_type, 'maatouch')

    # adb環境変数を設定するか、adb実行可能ファイルのパスを変更してください
    if asst.connect('/home/linsoap/Android/Sdk/platform-tools/adb', 'emulator-5554'):
        print('接続成功')
    else:
        print('接続失敗')
        exit()

    # タスクとパラメータはdocs/集成文档.mdを参照してください

    if args.start_up:
        asst.append_task('StartUp', {
            'client_type': 'Official',
            'start_game_enabled': True
        })

    if args.recruit:
        asst.append_task('Recruit', {
            'enable': True,
            'select': [4],
            'confirm': [3, 4],
            'times': 4
        })

    if args.infrast:
        asst.append_task('Infrast', {
            'enable': True,
            'facility': [
                "Mfg", "Trade", "Control", "Power", "Reception", "Office", "Dorm"
            ],
            'drones': "Money"
        })

    if args.visit:
        asst.append_task('Visit')

    if args.mall:
        asst.append_task('Mall', {
            'shopping': True,
            'buy_first': ['招聘许可', '龙门币'],
            'blacklist': ['家具', '碳'],
        })

    if args.fight:
        fight_params = {'enable': True}

        if args.stage:
            fight_params['stage'] = args.stage

        asst.append_task('Fight', fight_params)

    if args.award:
        asst.append_task('Award', {
            'enable': True,
        })

    asst.start()

    while asst.running():
        time.sleep(0)

Updater クラスには現在いくつかの問題があるため、直接コメントアウトすることをお勧めします。バグが修正されたらコメントを解除すれば大丈夫です。
上記の設定をインストールすれば、以下のコマンドで MAA を起動できます。

python emulator-54.py --start-up --recruit --infrast --visit --mall --fight --stage AP-5 --award

ワンクリックスクリプト#

エミュレーターをワンクリックで起動#

ワンクリックで収穫を行うためには、複数のエミュレーターをワンクリックで起動するスクリプトが必要です。まず、sample.py を複製し、その中の adb 名を変更するだけです。
最初の問題は、AVD の adb 名が固定ではなく、起動順に割り当てられることです。私は 2 つの公式アカウントと 1 つの b 服アカウントを持っており、ランダムな adb 名は StartUp タスクの失敗を引き起こす可能性があります。そのため、多重起動時にはポートを指定する必要があります。対応するクライアントが対応するタスクを実行できるようにします。

#!/bin/bash

while [ "$#" -gt 0 ]; do
  case "$1" in
    --start)
      shift
      while [ "$#" -gt 0 ]; do
        case "$1" in
          --all)
            echo "すべてのエミュレーターを起動しています..."
            /home/linsoap/Android/Sdk/emulator/emulator -avd aknz -ports 5554,5555 &
            /home/linsoap/Android/Sdk/emulator/emulator -avd aknz_1 -ports 5556,5557 &
            /home/linsoap/Android/Sdk/emulator/emulator -avd mrfz -ports 5558,5559 &
            shift
            ;;
          --list)
            echo "利用可能なエミュレーター:"
            /home/linsoap/Android/Sdk/emulator/emulator -list-avds
            shift
            ;;
          -*)
            echo "不明なオプション: $1"
            exit 1
            ;;
          *)
            echo "エミュレーターを起動しています: $1"
            /home/linsoap/Android/Sdk/emulator/emulator -avd "$1" &
            shift
            ;;
        esac
      done
      ;;
    --stop)
      shift
      while [ "$#" -gt 0 ]; do
        case "$1" in
          --all)
            echo "すべてのエミュレーターを停止しています..."
            /home/linsoap/Android/Sdk/platform-tools/adb -s emulator-5554 emu kill
            /home/linsoap/Android/Sdk/platform-tools/adb -s emulator-5556 emu kill
            /home/linsoap/Android/Sdk/platform-tools/adb -s emulator-5558 emu kill
            shift
            ;;
          -*)
            echo "不明なオプション: $1"
            exit 1
            ;;
          *)
            echo "エミュレーターを停止しています: $1"
            /home/linsoap/Android/Sdk/platform-tools/adb -s "$1" emu kill
            shift
            ;;
        esac
      done
      ;;
    -*)
      echo "不明なオプション: $1"
      exit 1
      ;;
  esac
done

上記は私が ChatGPT を使って生成したワンクリック起動スクリプトです。自分のニーズに応じて GPT にスクリプトを生成させれば大丈夫です。

  • すべてのエミュレーターを起動: ./your_script.sh --start --all
  • 特定のエミュレーターを起動: ./your_script.sh --start <emulator_name>
  • 利用可能なエミュレーターリストを表示: ./your_script.sh --start --list
  • すべてのエミュレーターを停止: ./your_script.sh --stop --all
  • 特定のエミュレーターを停止: ./your_script.sh --stop <emulator_name>

MAA をワンクリックで起動#

sample.py を変更して、引数を受け取って有効なタスクを選択できるようにしたので、MAA をワンクリックで起動するスクリプトを作成するのも簡単になりました。ChatGPT を使ってニーズに応じたスクリプトを生成すれば大丈夫です。以下は私のスクリプトです。

#!/bin/bash

# 実行するPythonスクリプトファイルのリストを設定
python_scripts=("emulator-54.py" "emulator-56.py" "emulator-58.py")

# デフォルトの引数値
all_flag=false
only_fight_flag=false
unfight_flag=false
stage_value=""

# コマンドライン引数を解析
while [ "$#" -gt 0 ]; do
  case "$1" in
    --all)
      all_flag=true
      ;;
    --only-fight)
      only_fight_flag=true
      ;;
    --unfight)
      unfight_flag=true
      ;;
    -stage|--stage)
      shift
      stage_value="$1"
      ;;
    *)
      echo "不明なオプション: $1"
      exit 1
      ;;
  esac
  shift
done

# 引数の組み合わせをチェック
if [ "$all_flag" = true ] && [ "$only_fight_flag" = true ]; then
  echo "--allと--only-fightを同時に使用することはできません。"
  exit 1
fi

# コマンドライン引数文字列を構築
args="--start-up"

if [ "$all_flag" = true ] || [ "$only_fight_flag" = true ]; then
  args+=" --recruit --infrast --visit --mall --award --fight"
fi
if [ "$only_fight_flag" = true ]; then
  args+=" --fight"
fi

if [ -n "$stage_value" ]; then
  args+=" --stage $stage_value"
fi

# 3つのPythonコマンドを直列に実行
for script in "${python_scripts[@]}"; do
  # 現在実行中のタスクを出力
  echo "$script内のタスクを実行中"

  # 直列に実行
  python "$script" $args & echo "$script内のタスクが完了しました" || echo "$script内のタスクの実行に失敗しました"
done

echo "すべてのタスクが完了しました"

このスクリプトは以下のコマンドをサポートしています。

  • --all: すべてのタスクを起動します。--start-up, --recruit, --infrast, --visit, --mall, --awardおよび--fightを含みます。
  • --only-fight: すべてのタスクを起動します。--start-upおよび--fightを含みます。
  • --unfight: すべてのタスクを起動しますが、--fightを含みません。
  • --stage <value>または-stage <value>: タスクのステージの値を指定します。

明日方舟をプレイする#

id

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。