※本記事は、ポケモンSVの藍の円盤(DLC)にて、道具プリンターを決まった日時に起動することで特定のアイテム、ボールを狙って量産する操作を自動化するプログラムについて解説した記事です。ポケモンSVの操作をArduino Leonardoで自動化しております。
本記事の内容は、いわゆる乱数調整を含むものとなります。 乱数調整等が苦手な方はブラウザバック推奨です。
「Arduinoって何?」って方は剣盾の00回目の記事を、Arduinoの環境構築(ライブラリ含む)は01回目の記事をご覧ください。
2024/07/22:動作確認用の動画を公開しました。スケッチのバージョンは1.1のまま変わらずです。本記事では、このプログラム(スケッチ)でできることや原理を解説したうえで、スケッチを配布しています。とにかくスケッチが欲しいという方は下へと読み飛ばしてください。
きっかけ、動機
ポケモンSVのDLC第2弾、藍の円盤が公開され、追加要素の1つ、どうぐプリンターにて最近になり乱数調整が報告されていました。特定の時間にどうぐプリンターを開くと毎回同じアイテムが出たり、必ずレアボールチャンスや道具2倍チャンスに突入したりすることが報告されました。現在はTwitterにて「#道具プリンター設定」を検索するとレアボールや特性パッチを大量に入手できる日時設定がさまざまに報告されています。
どうやら今回の乱数調整は1秒単位?でしか変化しない超ガバ仕様らしい。じゃあArduinoでも自動化できそうだねってことでやってみた。
これで何ができるの?
ブルーベリー学園のリーグ部にて設置できる道具プリンターにて、ガンテツやサファリコンペドリームウルトラボールといったレアボール、特性パッチやテラピース、店売りしていない進化用アイテムなど、狙ったアイテムを量産することができます。有志の方々が報告している設定日時をスケッチに書き込み自動化実行することでチャンスタイム突入とレアアイテム入手の2段階のガチャを繰り返し引きます。
なお、今回は道具プリンター設定として以下の記事を参考にさせていただきました。道具プリンターを調査、報告してくださった方々、そして情報をまとめてくださった じゃんきー様に感謝いたします。
原理、おおまかな流れ
概要
本プログラムでは、
設定日時①に時間変更
→指定秒数①で道具プリンターを実行(チャンスタイム突入)
→設定日時②に時間変更
→指定秒数②で道具プリンターを実行(狙ったアイテム排出)
→再び設定日時①に時間変更...
を繰り返します。
プリント回数(連ガチャ数)も1連、5連、10連の3通りで設定できるため、
設定日時①には1連でチャンスタイム突入になるように設定、
設定日時②には10連(あるいは5連×2回)で目的アイテムが排出されるように設定することで、素材を節約しながらアイテム量産ができます。
そもそも道具プリンター乱数調整とは何か、については他の方の記事をご覧ください(私もよく分かっていません)。まだ完全に解明されたわけでもないようなので、おそらく本記事執筆時点よりも調査が進んでいるかと思います。
設定日時について
本スケッチでは、上段の「★設定項目」にて、設定する日時およびプリント回数(連ガチャ数)を
int firstTime[7] = {57, 1, 10, 12, 42, 21, 0}; int firstGacha = 0;
のように記述しています。
int firstTime[7] = {57, 1, 10, 12, 42, 21, 0};
については、前から順に
{年(20XX年の下2桁、00~60),
月(1~12),
日(1~31, 最大値は月に依存のため、29以上だと月の変更時にずれる可能性あり),
時(0~23),
分(0~59、ただし58以上だと時間経過で時が変化する可能性があるため要調整),
秒(6~70くらい、0~5秒は時間変更~プリンター起動の動作の都合で非対応、秒数を61以上にすることで対応できるが待ち時間が長くなるため非推奨),
ミリ秒(-1000~1000くらい、1000ミリ秒=1秒、微調整用)}
となっています。チャンスタイム突入や目的アイテム排出の時間を設定することで、年月日時分までを本体設定から変更し、そこから〇秒△ミリ秒経過後にプリンターを起動します。
また、 int firstGacha = 0; は設定日時のガチャ時におけるプリント回数(連ガチャ数)を設定しており、
0: 1連、1: 5連、2: 10連
となっています。チャンスタイム突入には1連(0)を、目的アイテム排出には5連(1)または10連(2)を想定しています。
以上、設定する日時やプリント回数として、①firstTime/firstGachaと②secondTime/secondGachaの2組を用意する必要があります。
これらはスケッチ上段の「★」設定項目にて設定例をいくつか用意しており、コメントアウト(//)してあります。目的に合った設定部分のコメントアウトを解除して使用してください。
設定例にないものは設定例と同様にして任意の日時やプリント回数を記述してください。
その他、nowTime/nowGachaで動作中の日時やプリント回数状況を記録、上書きしています。
そして、nowTime/nowGachaの初期値は自動化開始時のものにする必要があります。
・nowGachaについて、起動時のプリント回数が初期値と同じ表示になっているか、あらかじめプリント回数を確認し、同じ表示に合わせてからプリンターを終了してください(配布時の設定では2、つまり10連にしています。)。
・nowTimeについて、自動化開始直前、約40秒以内に本体の時間変更をしてからマイコンを挿してください。自動化のたびにnowTimeの初期値と同じ時間変更をする必要があるため、分かりやすい日時にしておくことを推奨します(配布時の設定では2050年1月1日0時0分)。なお、初期値の秒、ミリ秒の値は使用しません。
自動化時の周回動作について
本スケッチでは、
設定日時①に時間変更
→指定秒数①で道具プリンターを実行(チャンスタイム突入)
→設定日時②に時間変更
→指定秒数②で道具プリンターを実行(狙ったアイテム排出)
→再び設定日時①に時間変更...
を繰り返します。そのうち、「時間変更後~指定秒数でプリンターを実行~次の設定日時に時間変更」までの一連の動作を
void itemPrint(int thisGacha, int nextTime[7]){...}
として1つの関数で動かしています。
引数として、「今回の動作でのプリント回数(thisGacha)」と「次の設定日時(nextTime)」を受け取りつつ、現在の動作までのnowTime/nowGachaと対応して時間変更、ガチャ回数の変更を行います。
また、一連の動作に1~2分ほどかかるため、次の時間変更時には1~2分の経過を考慮して動きます。
スケッチの動作を関数ごとの動作に分割すると、
設定日時①に時間変更(daySelect(設定日時①)、itemPrintのうち、最後に行う時間変更部分のみを実行、nowTimeを設定日時①に上書き)
→指定秒数①で道具プリンターを実行(チャンスタイム突入)~設定日時②に時間変更
(itemPrint(プリント回数①, 設定日時②)、および現在の設定日時(①)とプリント回数(初期値)を参照、最後にnowTimeを設定日時②に、nowGachaをプリント回数①に上書き)
→指定秒数②で道具プリンターを実行(狙ったアイテム排出)~設定日時①に時間変更
(itemPrint(プリント回数②, 設定日時①)、および現在の設定日時(②)とプリント回数(①)を参照、最後にnowTimeを設定日時①に、nowGachaをプリント回数②に上書き)
→指定秒数①で道具プリンターを実行(チャンスタイム突入)~設定日時②に時間変更
(itemPrint(プリント回数①, 設定日時②)、および現在の設定日時(①)とプリント回数(②)を参照、最後にnowTimeを設定日時②に、nowGachaをプリント回数①に上書き)
→指定秒数②で道具プリンターを実行(狙ったアイテム排出)~(ry...
のようになります。
5連ガチャ時の動作分岐
本スケッチはチャンスタイム突入(①)と狙ったアイテム排出(②)の2通りのプリンター設定を想定しているため、基本的には上記のように①と②を交互に繰り返します。
一方、チャンスタイム突入後はプリンターを合計10連分使用するまでチャンスが続きます。つまり、10連ガチャなら1回し、5連ガチャなら2回し、1連ガチャなら10回しするまでチャンス継続です。
乱数の都合上、②で10連ガチャをするよりも、5連ガチャを2回回した方が素材や時間の効率が良い場合が考えられます。ただし①と②を交互にするのでは、
①(チャンス突入) →②(チャンス5/10消費)
→①(チャンス継続したまま、6/10消費)→②(チャンス残4回適用、1回は適用されず)
→①(チャンス突入)...
となり、チャンスタイムを①で余計に使用してしまうこととなります。
したがって、本スケッチでは②のプリント回数が5連の場合にのみ、①→②→②→①...のように①1回の後に②を2回、計10連分繰り返すように分岐しています。
準備、必要なもの
本スケッチでは、マイコンを挿す前に以下の準備をしてください。
0. あらかじめプリンターの改良を最大まで完了し、素材となる落とし物やBP集めをしておく
1. 以下の★設定項目を参照し、目的のアイテムにあわせて乱数調整の時間およびプリント回数を設定
2. 道具プリンターを起動できるように、研究員に話しかけられる位置へ移動する。
研究員に話しかけ、素材選択画面のプリント回数(ガチャ連続回数)を下記設定項目の「nowGacha」にあわせる(初期設定は10連)
3. Switch本体の時計を下記設定項目の「nowTime」に設定した日時分に合わせ(初期設定は2050/1/1 0時0分)、設定から40秒以内(時計が1分進む前)にマイコンを挿してスタート
4. 想定したガチャ結果にならない場合は、下記設定項目の「secondTime」等の最後の数字(ミリ秒)を調整して時間をあわせる
作成したスケッチ
道具プリンター乱数自動化のスケッチ最新版2024.04.29_ver1.1はこちら。
本スケッチを実際に使用した動画はこちら↓
↓以下はスケッチVer1.1。
* SV藍の円盤、どうぐプリンター乱数によりレアボール、特性パッチ、その他アイテムを量産するプログラム
* 10連ガチャ1回目、2回目それぞれ任意の日時分に時間変更>任意の秒数後にガチャを開き、1,5,10連いずれかでガチャを回すことが可能
* 1回目にレアボールチャンスあるいは道具2倍チャンスに突入、2回目に目的のアイテムの出る10連ガチャができるように設定することを推奨
* 日時や秒数についてはネットに転がっている報告を参照(ツイッターにて「#道具プリンター設定」)
*
*
* 初期条件は以下の通り
* 0. あらかじめプリンターの改良を最大まで完了し、素材となる落とし物やBP集めをしておく
* 1. 以下の★設定項目を参照し、目的のアイテムにあわせて乱数調整の時間およびプリント回数を設定
* 2. 道具プリンターを起動できるように、研究員に話しかけられる位置へ移動する。
* 研究員に話しかけ、素材選択画面のプリント回数(ガチャ連続回数)を下記設定項目の「nowGacha」にあわせる(初期設定は10連)
* 3. Switch本体の時計を下記設定項目の「nowTime」に設定した日時分に合わせ(初期設定は2050/1/1 0時0分)、設定から40秒以内(時計が1分進む前)にマイコンを挿してスタート
* 4. 想定したガチャ結果にならない場合は、下記設定項目の「secondTime」等の最後の数字(ミリ秒)を調整して時間をあわせる
*/
// ----------★ここから設定項目----------
// プログラム開始時の時間を設定、順に[年(下2桁),月,日,時,分,秒,ミリ秒(調整用)]
// Arduinoを挿す直前に毎回手動で時間を設定することになるため、分かりやすい日時(2050.01.01.00.00など)を推奨
// 設定ルールについては、下記のfirstTimeその他と同様(ただし初期値の秒、ミリ秒の設定は使用しないため適当)
int nowTime[7] = {50, 1, 1, 0, 0, 0, 0};
// プログラム開始時に設定されているプリント回数(連ガチャ数)を設定、0:1連、1:5連、2:10連。
// 2回目の回数と同じにしておくと、書き換える際に扱いやすい
int nowGacha = 2;
// 「◆」の設定例から目的に合った設定を選びコメントアウト解除、あるいはint~で始まる各変数を目的のアイテムにあわせて設定してください
/*
* firstTime, secondTime, nowTime配列について
* 要素数7の配列の順に、
* 年、西暦20XX下2桁(00-60),
* 月(1-12),
* 日(1-31)(29以降だと、月変更時、特に2月をまたぐと数字がずれる可能性あり、その場合は要調整),
* 時(0-23),
* 分(0-59)(58以降だと時間経過で時も動く可能性があるため要調整),
* 秒(時間変更から開くまでに数秒必要なため6以上、0-5秒は指定不可能なため、その場合は秒数を61秒に設定する必要あり),
* ミリ秒、基本的に変更不要。ミリ秒単位で待機時間を調整したい場合のみ変更してください。
* 値の分だけ待機時間を延ばす、負の値は-1000(-1秒)まで設定可能
*
* firstGacha, secondGachaはそれぞれプリント回数(連ガチャ数)を設定、0:1連、1:5連、2:10連。
*/
// ◆以下、ガチャ1回目「firstTime」の設定例。使用する設定のint~~前のコメントアウトを解除してください
// 時間がずれる場合、配列最後の値を調整してください(ミリ秒、500なら0.5秒延長)
// ①1連でボールチャンス、猶予時間長め2057.01.10.12.42.21
int firstTime[7] = {57, 1, 10, 12, 42, 21, 0}; int firstGacha = 0;
// ②1連で道具2倍チャンス、猶予時間長め2056.11.27.00.54.10
//int firstTime[7] = {56, 11, 27, 0, 54, 10, 0}; int firstGacha = 0;
/*
* 10連ガチャ2回目の設定日時、秒。上記1回目と同様
*/
// ◆以下、ガチャ2回目「secondTime」の設定例。使用する場合は行頭のコメントアウトを解除してください
// ①レアボールチャンス時、10連でマスボ5ヘビボ1。2016.03.25.19.08.16.5
//int secondTime[7] = {16, 3, 25, 19, 8, 16, 1000}; int secondGacha = 2;
// ②レアボールチャンス時、10連でラブ1スピ1ヘビ1フレ1コンペ1サファリ1ドリ2ウル2(計10個)。2002.02.28.4.31.39.5
int secondTime[7] = {2, 2, 28, 4, 31, 39, 500}; int secondGacha = 2;
// ③レアボールチャンス時、5連でコンペ5。2009.06.05.20.17.10
//int secondTime[7] = {9, 6, 5, 20, 17, 10, 200}; int secondGacha = 1;
// (1)道具2倍チャンス時、10連で特性パッチ9。2035.11.20.17.41.46.5
//int secondTime[7] = {35, 11, 20, 17, 41, 46, 700}; int secondGacha = 2;
// (2)道具2倍チャンス時、10連で虹ピース57。2044.05.11.19.56.45.5
//int secondTime[7] = {44, 5, 11, 19, 56, 45, 500}; int secondGacha = 2;
// ----------ここまで設定項目★----------
#include <auto_command_util.h>
// Switch本体の時間変更用関数
// 年月日それぞれの現在の日時(nowTime)と設定したい日時(引数next)との差分だけ年月日時分の設定を変更する
// 前の時間変更から1~2分程度のずれが生じることがあるため、ずれた分だけlagMinで調整(1-2)
void daySelect(int next[7] = nowTime, int lagMin = 0)
{
// ホーム画面 > 設定
pushButton(Button::HOME, 1000);
pushHatButton(Hat::DOWN, 100);
pushHatButton(Hat::RIGHT, 100, 5);
pushButton(Button::A, 1000);
// 設定 > 本体 > 日付と時刻
pushHatButtonContinuous(Hat::DOWN, 2000);
pushHatButton(Hat::RIGHT, 100);
pushHatButton(Hat::DOWN, 100, 10);
pushButton(Button::A, 500);
// 日付と時刻 > 現在の日付と時刻
pushHatButton(Hat::DOWN, 100, 2);
pushButton(Button::A, 500);
// 年の変更、値が正なら年を進め、負なら戻す
lagChange(next[0] - nowTime[0]);
// 月の変更
pushHatButton(Hat::RIGHT, 100);
lagChange(next[1] - nowTime[1]);
// 同様に日、時の変更
pushHatButton(Hat::RIGHT, 100);
lagChange(next[2] - nowTime[2]);
pushHatButton(Hat::RIGHT, 100);
lagChange(next[3] - nowTime[3]);
pushHatButton(Hat::RIGHT, 100);
// 分の変更、nowTimeから数分経過している場合は、その分だけlagMinで回数調整
lagChange(next[4] - nowTime[4] - lagMin);
// 変更後の日時(next)を現在日時(nowTime)に上書き
for(int i=0; i<7; i++){
nowTime[i] = next[i];
}
// OKで時間変更決定
pushHatButton(Hat::RIGHT, 100);
pushHatButton(Hat::UP, 100);
pushButton(Button::A, 300);
// ホーム画面 > ゲーム画面
pushButton(Button::HOME, 1000);
pushButton(Button::A, 500);
}
// 年月日時分の差分変更
// 差分を引数として受け取り、正負によって上下に数字変更
void lagChange(int lag){
if(lag <0){
// 負の数の場合、その絶対値だけ下入力、数字を減らす
pushHatButton(Hat::DOWN, 100, -1 * lag);
}else{
// 正の数の場合、その絶対値だけ上入力、数字を増やす
pushHatButton(Hat::UP, 100, lag);
}
}
// 時間変更後にどうぐプリンターを1回(1連~10連)回し、次の設定に時間変更する
// 引数に今回回すプリント回数(連ガチャ数)(thisGacha)と回した後に変更する日時(nextTime)を指定。現在設定のや回数(nowGacha)や日時(nowTime)との差分で動作
// 必ずdaySelectあるいはitemPrint直後に実行すること。
void itemPrint(int thisGacha, int nextTime[7]){
// 時間変更を終えた直後、どうぐプリンター前
// どうぐプリンター左にいる研究員に話しかける
pushButton(Button::A, 100, 3);
delay(1500);
// 道具をプリントする?▼
pushButton(Button::A, 200);
// ここまででdaySelectの時間変更決定から約5秒
// あらかじめ指定した日時の秒数-6秒だけ待機
for(int i=0; i < nowTime[5] - 6; i++){
delay(1000);
}
// さらに1秒後に指定時間、ここでミリ秒を調整
delay(nowTime[7] + 1000);
// プリントする!このタイミングでガチャ結果が決定するらしい
pushButton(Button::A, 4000);
// プリント回数設定(連ガチャ数)が現在と異なる場合、LRボタン操作
if((3 + thisGacha - nowGacha)%3 == 1){
pushButton(Button::R, 100);
}else if((3 + thisGacha - nowGacha)%3 == 2){
pushButton(Button::L, 100);
}
// 現在のプリント回数の設定値を上書き
nowGacha = thisGacha;
// おまかせ選択
pushButton(Button::X, 500);
// 決定、回す、ガチャ結果発表まで20秒弱
pushButton(Button::A, 100, 100);
// 正しく動作すればレアボールチャンス、続けて回さずに1度ガチャを終了する
pushButton(Button::B, 100, 105);
// 指定した秒数でプリントする!からここまで約46秒
// 2回目の時間変更を開始(時間変更画面に映る)までに8秒ちょいかかる
// 1回目の時間指定完了OKから2回目の時間指定開始までの合計時間はおよそnowTime[5] +54秒(≧60)
// 分がずれるため、この合計時間によって分岐
if(nowTime[5] < 56){
// 合計時間が110秒以下の場合、2回目の時間調整開始までに1分X秒経過
// それぞれの日時の差分-1分だけ時間変更
daySelect(nextTime, 1);
}else{
// 110秒以上120秒以下の場合は、念のため少し待ってから2分ちょい経過したものとして扱う
if(nowTime[5] < 66){
delay((67 - nowTime[5])*1000);
}
// それぞれの日時の差分-2分だけ時間変更
daySelect(nextTime, 2);
}
}
// 時間変更とガチャを2回ずつ繰り返す関数
// 乱数調整のための時間設定は上記★を参照
// 1回目に1連ガチャ(チャンスタイム突入)、2回目に10連ガチャをおこなうことを想定、その他の条件でもとりあえず交互に動くはず
// 必ずdaySelectあるいはitemPrint直後に実行すること。
void gacha10ren(){
// 直前にdaySelect(firstTime);が実行されていることを想定
// 1回目のガチャを実行し、2回目のガチャ日時に変更する
itemPrint(firstGacha, secondTime);
// 2回目のガチャを実行し、1回目のガチャ日時に変更する
itemPrint(secondGacha, firstTime);
}
// 時間変更とガチャを3回ずつ繰り返す関数、5連ガチャ用
// 乱数調整のための時間設定は上記★を参照
// 1回目に1連ガチャ(チャンスタイム突入)、2回目に5連ガチャ、3回目に2回目と同じ条件で5連ガチャ(ここでチャンスタイム終了)をおこなうことを想定
// 必ずdaySelectあるいはitemPrint直後に実行すること。
void gacha5ren(){
// 直前にdaySelect(firstTime);が実行されていることを想定
// 1回目のガチャを実行し、2回目のガチャ日時に変更する
itemPrint(firstGacha, secondTime);
// 2回目のガチャ(5連)を実行し、再び2回目のガチャ日時に変更する
itemPrint(secondGacha, secondTime);
// 2回目と同条件で3回目のガチャ(5連)を実行し、1回目のガチャ日時に変更する
itemPrint(secondGacha, firstTime);
}
// どうぐプリンターの前、受付に話しかけられる位置からスタート
// あらかじめ、プリント回数(連ガチャ数)を「nowGacha」に設定した回数にあわせておく
// 自動化開始の直前にSwitch本体の時計を「nowTime」に設定した日時分に合わせてからスタート
void setup(){
// 最初の数回の入力はswitchが認識しない場合があるので、無駄打ちをしておく
pushButton(Button::B, 500, 13);
// 初回はあらかじめ設定した日時に設定して動作開始
// 最初の時間変更
daySelect(firstTime);
}
// ここから同じアイテムがでるようにガチャ繰り返し
// 1回目にチャンスタイム(レアボールor道具2倍)突入を想定
// 2回目(チャンスタイム)に10連ガチャを引く場合、1回目と2回目の設定で交互にガチャを引く
// 2回目に5連ガチャを行う場合はチャンスタイム回数を消費するために同じ5連を2回繰り返し
void loop(){
// 「★設定項目」で指定したfirstTime,firstGacha,second~~に従いガチャを繰り返す
if(secondGacha == 1){
// 2回目に5連ガチャを指定した場合は、1回目を1度行った後に2回目5連を2回繰り返す
gacha5ren();
}else{
// それ以外は1回目と2回目を交互に繰り返す
gacha10ren();
}
}
最後に
本スケッチを使用することで、道具プリンター乱数を自動で行い、目的のボールやアイテムを狙って量産することができます。序盤ストーリー自動化して図鑑報酬でレアボール回収したり、ふしぎなおくりものマスボ配布周回したりといった苦労が水の泡レベルで量産できるようになりました。
ガチャ結果は1秒単位というガバ仕様なので、誤差が考えられるArduinoの自動化でも何とかなりました。時々目的でないガチャ結果となることもありますが、ストップウォッチとにらめっこしながら手動でおこなうよりも楽かと思います。
動かし続けると素材かBPがなくなるまで動きますのでご注意ください(1敗)
プログラムの不備、改善点などありましたらコメントやお問い合わせからお願いいたします。
Arduino Arduino Leonardo (ピンソケット・ピンヘッダ実装済) 【A000057】 | ||||
|
公開ありがとうございます。日付変更を伴う自動化はLiteとSwitchで設定項目の個数の違いからボタンの入力回数に差が発生しますが、公開されているスクリプトはSwitch用でしょうか?
返信削除liteじゃないSwitch用で作成しています。
削除おそらくliteには設定>本体>ドックの更新という項目が存在しないため、下入力の回数を減らす必要があります。
daySelect 内、// 設定 > 本体 > 日付と時刻 の下側
pushHatButton(Hat::DOWN, 100, 10);
の10を8-9に減らせばlite用に対応できるかと思います。
公開ありがとうございます。
返信削除当方Switchにて推奨の日時を初期値として動かしていますが、プリントせずに1日ずらすのみになってしまい、上手く動作しておりません。助言頂けますでしょうか?
初期値は推奨値
10連、レアボ複数で動かしております。
マイコン挿して起動(プリンター前でB連打、主人公屈伸)>起動直後にHOME画面設定から本体日時設定>2050年1月1日→2日に変更>プリンターは起動させないまま停止
削除ということでしょうか?なぜ1→2日になるのかはこちらも分かりません。
まずは、公開しているVer1.1をDLした直後、何も編集していない状態で、本体日時を2050/1/1 0:00に設定して動かしてみてください。
このコメントは投稿者によって削除されました。
返信削除公開ありがとうございます!
返信削除提案なんですけど、
最初のb連打で挙動が変化することがあります。
なので、a連打にするのはどうでしょうか?
a連打にすると時間設定のokにカーソルを合わせた状態でマイコンと接続すればokなので少し楽になると思います。
A連打だと誤って道具プリンターを開始する(話しかける)可能性があるためB連打にしています。
削除もし動作に影響があるようであればB連打の後に待機時間delayを設定するか、A連打などご自身で使いやすい形に編集するかしてください。