【Arduino自動化22】ウッウロボ自動合成【アメざいく・わざレコード・オシャボ集め】

ますたーです。こんにちは。

今回は、ウッウロボにレシピ通りに道具を入れ続ける自動化の記事です。

本ブログを2020年11月7日に公開してから、本日、おかげさまで1周年を迎えました!!。これからもよろしくお願いいたします

 

なお、Arduino Leonardo自動化の導入・機材構成については導入記事を参考にしてください。

導入記事:【Arduino自動化01】Arduino開発環境の導入

※本ブログに初めてお越しの方は「本ブログについて」もぜひ、ご覧ください。

 

概要

ウッウロボにアイテムを入れて、道具を作り続けます。もちろん、アイテムを入れる順番はプログラムで指定可能です。
※ウッウロボの特性上「セーブ」されます。くれぐれも自己責任でご利用ください

f:id:tangential_star:20211031182345p:plain
f:id:tangential_star:20211031181836g:plain
複雑なレシピでもしっかりとウッウロボに自動投入してくれる。アメざいく厳選もお手の物だ

もくじです。

今回も余談が多め、というかウッウロボの解説記事っぽくなりました。1周年にふさわしいボリューム感です。私のブログって、実は「自動化ブログ」じゃなくて「攻略記事ブログ」なのかもしれませんね。

例のごとく、ソースコードだけ欲しいという方はどうぞ→読み飛ばす

 

ウッウロボにアイテムを4つ入れると別のアイテムに変換できる

まずは、皆様も世話になっている「ウッウロボ」について紹介です。もちろん読み飛ばしOK→「ウッウロボのレシピの仕組み」まで読み飛ばす

ウッウロボとは、DLC第1弾「ヨロイの孤島」にて登場した、アイテム4つを入れると、別のアイテムに変換してくれるロボットです。その名が冠する通り、ウッウをモチーフにしたロボットで、獲物を丸呑みした状態から吐き出すまでの一連の動作を体現してくれます。

さて、このウッウロボですが、奇怪な見た目も然ることながら、本編(ガラル本土)だけでは入手方法が限られていたアイテム(特に「かえんだま」「どくどくだま」など)や、使い捨て故に個数が必要な「わざレコード」が全種類入手ができることも判明し、DLC公開当時は話題になりました。そして、DLC第1弾の目玉はなんと言っても「ぼんぐり」の登場。ウッウロボに入れる4つの道具をすべて「ぼんぐり」にすることで極低確率(0.1~1%)ながら、いわゆる「オシャボ」も手に入れることができるようになりました。

こういった経緯もあり、DLC公開が始まるや否や、有志によるウッウロボの排出アイテムの法則性探し、いわゆる「レシピ」の開発・調査が始まりました。

f:id:tangential_star:20211031214748p:plain
f:id:tangential_star:20211031182345p:plain
ガラル本土では入手できない&入手方法が限られていたアイテムも、ウッウロボならお手の物

ウッウロボのレシピの仕組み

ここで、レシピを紹介する前に、ウッウロボのレシピの仕組みについて紹介します(仕組みは分かっている、という方は→「ウッウロボで生成できるアイテムの一覧」まで読み飛ばす)。早く作り方が知りたい、という方は→「ウッウロボのレシピの作り方」まで読み飛ばす

アイテムを4つ入れることで新しいアイテムを出してくれるウッウロボですが、排出されるアイテムの種類はモンスターボール22種類を除く、純粋なアイテム「だけ」で実に180種類以上あります*1。このウッウロボから排出されるアイテムですが、実は180種からのランダムではなく、入れたアイテムの順番・レア度によって決定されています(=レシピがあります)。

実は、ポケモン剣盾の「アイテム」には、ポケモンのタイプのような18種類の「タイプ」と「ポイント」が、隠しパラメータとして設定されています。これらの組み合わせ(=レシピ)によって、出てくるアイテムが決まる、という仕組みです。

より厳密には「1番目に入れたアイテムに応じて15パターンに絞られ、アイテム4つのレア度の合計によって決定」される、という仕組みです*2。詳しくはレシピ例を交えて次節で説明します。

f:id:tangential_star:20211106151128p:plain

f:id:tangential_star:20211104000246p:plain

ウッウロボの仕組み。1番目の「タイプ」でラインナップが決まり、4つの合計ポイントでアイテムが決定する

ウッウロボで生成できるアイテムの一覧

以上に説明した通り、ウッウロボでは、道具ごとに決められた「タイプ」と「ポイント」の組み合わせによって狙ったアイテムが生成できることが分かります。

この「タイプ」ごとに載せたのが下記の表です。何が作れるのかが一覧で分かります*3

目当てのアイテムが探しやすいように、極力、同じアイテム同士が横並びになるよう、工夫して並び替えてありますので、是非ともご参考ください。

ウッウロボ排出アイテム(完成品)早見表(ポイント別;例外レシピ・ぼんぐり4つによるボール類を除く)
合計pt ノーマル エスパー みず でんき じめん くさ むし こおり ひこう ゴースト ドラゴン あく ほのお どく はがね かくとう いわ フェアリー
1~10pt わざレコード「ノーマル」
わざレコード85
(ふるいたてる)
わざレコード「エスパー」
わざレコード12
(こうそくいどう)

f:id:tangential_star:20211103215559p:plain

うしおのおこう

f:id:tangential_star:20211103215638p:plain

エレキシード

f:id:tangential_star:20211103215649p:plain

ほしのすな

f:id:tangential_star:20211103215704p:plain

グラスシード
わざレコード「むし」
わざレコード60
(シザークロス)

f:id:tangential_star:20211103215715p:plain

ゆきだま

f:id:tangential_star:20211103215827p:plain

きれいなハネ

f:id:tangential_star:20211103215836p:plain

あやしいおこう
わざレコード「ドラゴン」
わざレコード47
(ドラゴンクロー)
わざレコード「あく」
わざレコード37
(ちょうはつ)
わざレコード「ほのお」
わざレコード88
(ヒートスタンプ)

f:id:tangential_star:20211103215849p:plain

くろいヘドロ

わざレコード「はがね」
わざレコード31
(アイアンテール)
わざレコード「かくとう」
わざレコード07
(けたぐり)

f:id:tangential_star:20211103215905p:plain

かるいし

f:id:tangential_star:20211103215649p:plain

ほしのすな
11~15pt わざレコード「ノーマル」
わざレコード14
(ゆびをふる)
わざレコード「エスパー」
わざレコード34
(みらいよち)
わざレコード「みず」
わざレコード04
(なみのり)
わざレコード「でんき」
わざレコード80
(エレキボール)
わざレコード「じめん」
わざレコード23
(まきびし)
わざレコード「くさ」
わざレコード59
(タネばくだん)
わざレコード「むし」
わざレコード18
(きゅうけつ)

f:id:tangential_star:20211103215931p:plain

つめたいいわ

f:id:tangential_star:20211103215938p:plain

するどいくちばし

f:id:tangential_star:20211103215946p:plain

ビビリだま

f:id:tangential_star:20211103215953p:plain

りゅうのキバ

f:id:tangential_star:20211103220003p:plain

こうかくレンズ

f:id:tangential_star:20211103220010p:plain

かえんだま

f:id:tangential_star:20211103220018p:plain

どくどくだま
わざレコード「はがね」
わざレコード46
(てっぺき)
わざレコード「かくとう」
わざレコード56
(はどうだん)

f:id:tangential_star:20211103220028p:plain

まんまるいし

f:id:tangential_star:20211103220037p:plain

ミストシード
16~20pt わざレコード「ノーマル」
わざレコード26
(こらえる)
わざレコード「エスパー」
わざレコード40
(スキルスワップ)

f:id:tangential_star:20211103220051p:plain

かいがらのすず

f:id:tangential_star:20211103220059p:plain

じゅうでんち

f:id:tangential_star:20211103213410p:plain

おおきなキノコ

f:id:tangential_star:20211103220143p:plain

しろいハーブ

f:id:tangential_star:20211103220151p:plain

ひかりのこな

f:id:tangential_star:20211103220202p:plain

とけないこおり

f:id:tangential_star:20211103213410p:plain

おおきなキノコ

f:id:tangential_star:20211103220210p:plain

ねらいのまと

f:id:tangential_star:20211103213410p:plain

おおきなキノコ
わざレコード「あく」
わざレコード68
(わるだくみ)
わざレコード「ほのお」
わざレコード41
(ブレイズキック)
わざレコード「どく」
わざレコード91
(ベノムトラップ)

f:id:tangential_star:20211103220230p:plain

メタルパウダー

f:id:tangential_star:20211103220236p:plain

ちからのハチマキ

f:id:tangential_star:20211103220245p:plain

かたいいし

f:id:tangential_star:20211103213410p:plain

おおきなキノコ
21~25pt わざレコード「ノーマル」
わざレコード13
(きあいだめ)
わざレコード「エスパー」
わざレコード82
(アシストパワー)
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
ねがいのかたまり
26~30pt わざレコード「ノーマル」
わざレコード27
(ねごと)
わざレコード「エスパー」
わざレコード44
(コスモパワー)
わざレコード「みず」
わざレコード16
(たきのぼり)

f:id:tangential_star:20211103220302p:plain

じしゃく

f:id:tangential_star:20211103220310p:plain

ひかりのねんど
わざレコード「くさ」
わざレコード77
(くさむすび)

f:id:tangential_star:20211103220321p:plain

ぎんのこな
ほしのかけら
ほしのかけら

f:id:tangential_star:20211103215733p:plain

ふうせん
ほしのかけら
ほしのかけら
ほしのかけら
ほしのかけら
ほしのかけら
ほしのかけら
わざレコード「ほのお」
わざレコード02
(かえんほうしゃ)
わざレコード「どく」
わざレコード54
(どくびし)

f:id:tangential_star:20211103220346p:plain

ばんのうがさ
わざレコード「かくとう」
わざレコード48
(ビルドアップ)

f:id:tangential_star:20211103220354p:plain

かわらずのいし

f:id:tangential_star:20211103220402p:plain

においぶくろ
31~35pt わざレコード「ノーマル」
わざレコード35
(さわぐ)
わざレコード「エスパー」
わざレコード83
(サイドチェンジ)
わざレコード「みず」
わざレコード98
(アクアブレイク)
わざレコード「でんき」
わざレコード86
(ワイルドボルト)
わざレコード「じめん」
わざレコード87
(ドリルライナー)
わざレコード「くさ」
わざレコード50
(リーフブレード)
かおるキノコ
かおるキノコ
かおるキノコ
かおるキノコ

f:id:tangential_star:20211103220332p:plain

からぶりほけん
かおるキノコ
かおるキノコ
かおるキノコ
かおるキノコ
かおるキノコ
かおるキノコ
かおるキノコ
かおるキノコ

f:id:tangential_star:20211103220537p:plain

けむりだま

f:id:tangential_star:20211103220529p:plain

メタルコート
わざレコード「かくとう」
わざレコード21
(きしかいせい)

f:id:tangential_star:20211103220442p:plain

プロテクター

f:id:tangential_star:20211103220410p:plain

ルームサービス
36~40pt わざレコード「ノーマル」
わざレコード01
(のしかかり)
わざレコード「エスパー」
わざレコード25
(サイコショック)

f:id:tangential_star:20211103221031p:plain

きれいなウロコ

f:id:tangential_star:20211103221023p:plain

アップグレード
わざレコード「じめん」
わざレコード67
(だいちのちから)
わざレコード「くさ」
わざレコード65
(エナジーボール)
わざレコード「むし」
わざレコード61
(むしのさざめき)

f:id:tangential_star:20211103220941p:plain

するどいツメ

f:id:tangential_star:20211103220935p:plain

ねばりのかぎづめ

f:id:tangential_star:20211103220910p:plain

きよめのおふだ

f:id:tangential_star:20211103220904p:plain

りゅうのウロコ
わざレコード「あく」
わざレコード81
(イカサマ)
わざレコード「ほのお」
わざレコード36
(ねっぷう)
わざレコード「どく」
わざレコード57
(どくづき)
わざレコード「はがね」
わざレコード52
(ジャイロボール)

f:id:tangential_star:20211103220433p:plain

きょうせいギプス

f:id:tangential_star:20211103220426p:plain

ゴツゴツメット

f:id:tangential_star:20211103220417p:plain

ホイップポップ
41~45pt わざレコード「ノーマル」
わざレコード19
(トライアタック)
わざレコード「エスパー」
わざレコード69
(しねんのずつき)

f:id:tangential_star:20211103221037p:plain

しんぴのしずく

f:id:tangential_star:20211103221010p:plain

でんきだま

f:id:tangential_star:20211103221004p:plain

グランドコート

f:id:tangential_star:20211103220958p:plain

きゅうこん

f:id:tangential_star:20211103220949p:plain

きれいなぬけがら

f:id:tangential_star:20211103215724p:plain

ゆきだま

f:id:tangential_star:20211103215733p:plain

ふうせん

f:id:tangential_star:20211103220918p:plain

のろいのおふだ

f:id:tangential_star:20211103220857p:plain

いのちのたま

f:id:tangential_star:20211103220823p:plain

ピントレンズ

f:id:tangential_star:20211103220815p:plain

レッドカード

f:id:tangential_star:20211103220516p:plain

スピードパウダー

f:id:tangential_star:20211103220523p:plain

とつげきチョッキ
わざレコード「かくとう」
わざレコード99
(ボディプレス)
わざレコード「いわ」
わざレコード63
(パワージェム)

f:id:tangential_star:20211103220449p:plain

あかいいと
46~50pt わざレコード「ノーマル」
わざレコード29
(バトンタッチ)
わざレコード「エスパー」
わざレコード17
(ドわすれ)
おだんごしんじゅ
おだんごしんじゅ
おだんごしんじゅ
おだんごしんじゅ
おだんごしんじゅ
おだんごしんじゅ
おだんごしんじゅ
おだんごしんじゅ
おだんごしんじゅ
おだんごしんじゅ
おだんごしんじゅ
おだんごしんじゅ

f:id:tangential_star:20211103220927p:plain

じゃくてんほけん

f:id:tangential_star:20211103220851p:plain

われたポット
わざレコード「ドラゴン」
わざレコード62
(りゅうのはどう)
わざレコード「あく」
わざレコード95
(じごくづき)
わざレコード「ほのお」
わざレコード15
(だいもんじ)

f:id:tangential_star:20211103220508p:plain

どくバリ
わざレコード「はがね」
わざレコード79
(ヘビーボンバー)

f:id:tangential_star:20211103220500p:plain

たつじんのおび
ねがいのかたまり
ねがいのかたまり

f:id:tangential_star:20211103220700p:plain

アメざいく4種
(ランダム)
51~55pt わざレコード「ノーマル」
わざレコード30
(アンコール)
わざレコード「エスパー」
わざレコード38
(トリック)
わざレコード「みず」
わざレコード45
(だくりゅう)

f:id:tangential_star:20211103221015p:plain

あやしいパッチ
わざレコード「じめん」
わざレコード94
(10まんばりき)
わざレコード「くさ」
わざレコード72
(パワーウィップ)
わざレコード「むし」
わざレコード96
(かふんだんご)
わざレコード「こおり」
わざレコード05
(れいとうビーム)
わざレコード「ひこう」
わざレコード89
(ぼうふう)

f:id:tangential_star:20211103220843p:plain

れいかいのぬの

f:id:tangential_star:20211103220836p:plain

おうじゃのしるし
わざレコード「あく」
わざレコード58
(あくのはどう)

f:id:tangential_star:20211103220829p:plain

もくたん
わざレコード「どく」
わざレコード22
(ヘドロばくだん)

f:id:tangential_star:20211103220546p:plain

おまもりこばん
わざレコード「かくとう」
わざレコード64
(きあいだま)

f:id:tangential_star:20211103220554p:plain

しんかのきせき
わざレコード「フェアリー」
わざレコード92
(マジカルシャイン)
56~60pt わざレコード「ノーマル」
わざレコード20
(みがわり)
わざレコード「エスパー」
わざレコード49
(めいそう)
わざレコード「みず」
わざレコード84
(ねっとう)
わざレコード「でんき」
わざレコード08
(10まんボルト)
すいせいのかけら
すいせいのかけら
すいせいのかけら
すいせいのかけら
すいせいのかけら
すいせいのかけら
すいせいのかけら
すいせいのかけら
すいせいのかけら
すいせいのかけら
すいせいのかけら
すいせいのかけら
わざレコード「ドラゴン」
わざレコード51
(りゅうのまい)
わざレコード「あく」
わざレコード32
(かみくだく)
わざレコード「ほのお」
わざレコード55
(フレアドライブ)
わざレコード「どく」
わざレコード78
(ヘドロウェーブ)
わざレコード「はがね」
わざレコード70
(ラスターカノン)
わざレコード「かくとう」
わざレコード39
(ばかぢから)
わざレコード「いわ」
わざレコード76
(ステルスロック)

f:id:tangential_star:20211104002846p:plain

アメざいく3種
(ランダム)

61~65pt わざレコード「ノーマル」
わざレコード00
(つるぎのまい)
わざレコード「エスパー」
わざレコード97
(サイコファング)
わざレコード「みず」
わざレコード03
(ハイドロポンプ)
わざレコード「でんき」
わざレコード09
(かみなり)
わざレコード「じめん」
わざレコード10
(じしん)
わざレコード「くさ」
わざレコード71
(リーフストーム)
わざレコード「むし」
わざレコード28
(メガホーン)
わざレコード「こおり」
わざレコード06
(ふぶき)
わざレコード「ひこう」
わざレコード66
(ブレイブバード)
わざレコード「ゴースト」
わざレコード33
(シャドーボール)
わざレコード「ドラゴン」
わざレコード24
(げきりん)
わざレコード「あく」
わざレコード93
(DDラリアット)
わざレコード「ほのお」
わざレコード43
(オーバーヒート)
わざレコード「どく」
わざレコード73
(ダストシュート)
わざレコード「はがね」
わざレコード74
(アイアンヘッド)
わざレコード「かくとう」
わざレコード53
(インファイト)
わざレコード「いわ」
わざレコード75
(ストーンエッジ)
わざレコード「フェアリー」
わざレコード90
(じゃれつく)
66~70pt わざレコード「ノーマル」
わざレコード42
(ハイパーボイス)
わざレコード「エスパー」
わざレコード11
(サイコキネシス)
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
ふしぎなアメ
71~75pt ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
ぎんのおうかん
76~80pt ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ
ポイントアップ

※タイプ・数値ポイントの情報はポケモンWikiウッウロボ」より引用。

この表から分かる通り、ウッウロボからはすべての「わざレコード」、入手困難な「進化アイテム」、BP交換で入手可能な「戦闘用アイテム」など、様々なものが「狙って出せる」ということがわかります。また、表の行には1つ目に入れるアイテムの「タイプ」が、列には必要なポイント合計が逆引きできるので、ウッウロボに入れるアイテムのレシピを考えることができます。実際の作り方は次節にて説明します。

 

ウッウロボのレシピの作り方

前述の通り、ウッウロボでは、1番目の投入アイテムの「タイプ」と、投入アイテム4つの「素材ポイント」の合計によって排出されるアイテムが決まります。

f:id:tangential_star:20211106195859p:plain
f:id:tangential_star:20211106195909p:plain
ウッウロボで作れるアイテム一覧(左)と、そのレシピの作り方のイメージ(右)
これらは画像保存しておくとすごく便利だ。

この「素材ポイント」「タイプ」についてですが、こちらも一定の法則性(例えば「きのみ」の素材ptが6,7世代の「しぜんのめぐみ」の威力に連動する*4、「メモリ」は一律10ptでタイプはそれぞれに依存、「カセキ」は一律5ptでタイプは対応するポケモンに複合されるもの、など)があります。そして、アイテムごとの「ポイント」についてはポケモンWikiウッウロボ」のページに纏まっています。

しかし、せっかくポイントが分かっても、アイテムをウッウロボに入れる(=消費する)ので、よほどブルジョワでない限り、複数入手が容易なアイテムを選ぶべきです*5

そこで、筆者は下記画像のように、よく使うアイテム(=複数入手が比較的容易なアイテム)について「タイプ」と「ポイント」をまとめました。まとめるのめちゃくちゃ頑張りました

f:id:tangential_star:20211106203346p:plain

ウッウロボで使うのに適した「素材」ガイド
 周回作業などで溜まっていることが多いものを筆者でチョイスした。画像保存推奨

ウッウロボのレシピ例

さて、レシピの仕組み・作り方については前述の通りですが、これらを踏まえて、いくつか、具体的な例を挙げます。もちろん、ただの例なので読み飛ばしOK→「例外のレシピ(上位アイテムへの変換)」まで読み飛ばす

下記の表をご覧ください。

ウッウロボの合成レシピ例(「1つ目のタイプと4つの合計pt」に対応するアイテムが排出)
完成品 1番目のアイテム 2番目のアイテム 3番目のアイテム 4番目のアイテム

f:id:tangential_star:20211103220857p:plain

どくどくだま
どく/11~15pt)

f:id:tangential_star:20211105205207p:plain

オレンのみ
どく・1pt

f:id:tangential_star:20211105205207p:plain

オレンのみ

どく・1pt

f:id:tangential_star:20211105205207p:plain

オレンのみ
どく・1pt

f:id:tangential_star:20211103213342p:plain

ほしのかけら
いわ・10pt

f:id:tangential_star:20211103221010p:plain

でんきだま
でんき/41~45pt)

f:id:tangential_star:20211105205323p:plain

かみなりのいし
でんき・3pt

f:id:tangential_star:20211103213318p:plain

ねがいのかたまり
どく・14pt

f:id:tangential_star:20211103213318p:plain

ねがいのかたまり
どく・14pt

f:id:tangential_star:20211103213318p:plain

ねがいのかたまり
どく・14pt

f:id:tangential_star:20211103220426p:plain

ゴツゴツメット
いわ/36~40pt)

f:id:tangential_star:20211103220354p:plain

かわらずのいし
いわ・10pt

f:id:tangential_star:20211103220354p:plain

かわらずのいし
いわ・10pt

f:id:tangential_star:20211103220354p:plain

かわらずのいし
いわ・10pt

f:id:tangential_star:20211103220354p:plain

かわらずのいし
いわ・10pt

f:id:tangential_star:20211103220426p:plain

ゴツゴツメット
いわ/36~40pt)

f:id:tangential_star:20211103220354p:plain

かわらずのいし
いわ・10pt

f:id:tangential_star:20211103213342p:plain

ほしのかけら
いわ・10pt

f:id:tangential_star:20211103213342p:plain

ほしのかけら
いわ・10pt

f:id:tangential_star:20211103213342p:plain

ほしのかけら
いわ・10pt

f:id:tangential_star:20211103220346p:plain

ばんのうがさ
はがね/26~30pt)

f:id:tangential_star:20211103220529p:plain

メタルコート
はがね・12pt

f:id:tangential_star:20211103220529p:plain

メタルコート
はがね・12pt

f:id:tangential_star:20211105205207p:plain

オレンのみ
どく・1pt

f:id:tangential_star:20211105205207p:plain

オレンのみ
どく・1pt

f:id:tangential_star:20211103220529p:plain

メタルコート

はがね/31~35pt)

f:id:tangential_star:20211103213429p:plain

ぎんのおうかん

はがね・20pt

f:id:tangential_star:20211103213342p:plain

ほしのかけら
いわ・10pt

f:id:tangential_star:20211105205207p:plain

オレンのみ
どく・1pt

f:id:tangential_star:20211105205207p:plain

オレンのみ
どく・1pt

f:id:tangential_star:20211103215733p:plain

ふうせん
ひこう/26~30pt)

f:id:tangential_star:20211103215827p:plain

ハネ系アイテム
ひこう・3pt

f:id:tangential_star:20211103215827p:plain

ハネ系アイテム
ひこう・3pt

f:id:tangential_star:20211103213342p:plain

ほしのかけら
いわ・10pt

f:id:tangential_star:20211103213342p:plain

ほしのかけら
いわ・10pt

f:id:tangential_star:20211103220332p:plain
からぶりほけん

ひこう/31~35pt)

f:id:tangential_star:20211103215827p:plain

ハネ系アイテム
ひこう・3pt

f:id:tangential_star:20211103213342p:plain

ほしのかけら

いわ・10pt

f:id:tangential_star:20211103213342p:plain

ほしのかけら
いわ・10pt

f:id:tangential_star:20211103213342p:plain

ほしのかけら
いわ・10pt

※タイプ・数値ポイントの情報はポケモンWikiウッウロボ」より引用。

まず前提として、ウッウロボからの排出アイテム・入れるアイテムには、それぞれ「タイプ」と「ポイント」が割り振られています。そして、前述の通り、ウッウロボから排出されるアイテムは「1つ目のタイプ」と「4つのポイント合計値」で決まります

例えば、「ばんのうがさ」を作るためには、1つ目に「はがね」タイプのアイテムを入れて、かつ、4つのアイテムのポイント合計が「26~30」の範囲内に収まれば良いので、「メタルコート」「メタルコート」「オレンのみ」「オレンのみ」で作ることができます。また、順番を入れ替えて、あるいは「メタルコート」「オレンのみ」「オレンのみ」「メタルコート」でも作ることができます*6

また、ウッウロボでは、計算でアイテムが決まる仕様のため、1つのアイテムに対して複数のレシピが成り立ちます。例えば「ゴツゴツメット」を作るためには「1つ目が『いわ』タイプで合計ポイントが『36~40pt』」である必要がありますが、最初に「かわらずのいし(いわ・10pt)」を入れ、以降2~4番目には「かわらずのいし」もしくは「ほしのかけら(いわ・10pt)」を任意の組み合わせで投入すれば良いと分かります*7。なお、言わずもがな「完成品に必要なポイント」と「入れたときに計算されるポイント」が異なるということには注意しなければなりません。例えば、「メタルコート」を作るためには「はがね/31~35pt」が必要ですが、メタルコートを素材にするときには「はがね・12pt」として計算されます。

以上のようにウッウロボは、要領が分かれば大して難しくないので、先程の一覧画像や素材の表を頼りに、自ら所持しているアイテムを使えるレシピを考えると良いかと思います。

例外のレシピ(上位アイテムへの変換)

ウッウロボから排出されるアイテムには、前述のレシピに則らない例外もあります。具体的には、下記11レシピですが、特筆すべきは「とくせいカプセル」でしょう。それ以外は、基本的に上位アイテムへの交換になるためある意味、想像通りの変換になります。

ウッウロボの例外レシピ(「1つ目・3つ目・4つ目」に対応するアイテムが排出)
完成品 1番目のアイテム 2番目のアイテム 3番目のアイテム 4番目のアイテム

f:id:tangential_star:20211106204440p:plain

でかいきんのたま

f:id:tangential_star:20211106204458p:plain

きんのたま
任意

f:id:tangential_star:20211106204458p:plain

きんのたま

f:id:tangential_star:20211106204458p:plain

きんのたま

f:id:tangential_star:20211106204523p:plain

おおきなキノコ

f:id:tangential_star:20211106204531p:plain

ちいさなキノコ
任意

f:id:tangential_star:20211106204531p:plain

ちいさなキノコ

f:id:tangential_star:20211106204531p:plain

ちいさなキノコ

f:id:tangential_star:20211106204552p:plain

かおるキノコ

f:id:tangential_star:20211106204523p:plain

おおきなキノコ
任意

f:id:tangential_star:20211106204523p:plain

おおきなキノコ

f:id:tangential_star:20211106204523p:plain

おおきなキノコ

f:id:tangential_star:20211106204618p:plain

ほしのかけら

f:id:tangential_star:20211106204626p:plain

ほしのすな
任意

f:id:tangential_star:20211106204626p:plain

ほしのすな

f:id:tangential_star:20211106204626p:plain

ほしのすな

f:id:tangential_star:20211106204644p:plain

すいせいのかけら

f:id:tangential_star:20211106204618p:plain

ほしのかけら
任意

f:id:tangential_star:20211106204618p:plain

ほしのかけら

f:id:tangential_star:20211106204618p:plain

ほしのかけら

f:id:tangential_star:20211106204708p:plain

おおきなしんじゅ

f:id:tangential_star:20211106204718p:plain

しんじゅ
任意

f:id:tangential_star:20211106204718p:plain

しんじゅ

f:id:tangential_star:20211106204718p:plain

しんじゅ

f:id:tangential_star:20211106204736p:plain

おだんごしんじゅ

f:id:tangential_star:20211106204708p:plain

おおきなしんじゅ
任意

f:id:tangential_star:20211106204708p:plain

おおきなしんじゅ

f:id:tangential_star:20211106204708p:plain

おおきなしんじゅ

f:id:tangential_star:20211106204756p:plain

きんのおうかん

f:id:tangential_star:20211106204804p:plain

ぎんのおうかん
任意

f:id:tangential_star:20211106204804p:plain

ぎんのおうかん

f:id:tangential_star:20211106204804p:plain

ぎんのおうかん

f:id:tangential_star:20211106204825p:plain

とくせいカプセル

f:id:tangential_star:20211106204834p:plain

ふしぎなアメ
任意

f:id:tangential_star:20211106204834p:plain

ふしぎなアメ

f:id:tangential_star:20211106204834p:plain

ふしぎなアメ

f:id:tangential_star:20211106204856p:plain

ポイントマックス

f:id:tangential_star:20211106204911p:plain

ヨロイこうせき
任意

f:id:tangential_star:20211106204911p:plain

ヨロイこうせき

f:id:tangential_star:20211106204911p:plain

ヨロイこうせき

f:id:tangential_star:20211106204856p:plain

ポイントマックス

f:id:tangential_star:20211106204938p:plain

マックスこうせき
任意

f:id:tangential_star:20211106204938p:plain

マックスこうせき

f:id:tangential_star:20211106204938p:plain

マックスこうせき

※タイプ・数値ポイントの情報はポケモンWikiウッウロボ」より引用。

重要なのは、きんのたま」「ちいさなキノコ」「おおきなキノコ」「ほしのかけら」「すいせいのかけら」「しんじゅ」「おおきなしんじゅ」「ぎんのおうかん」「ふしぎなアメ」「ヨロイこうせき」「マックスこうせき」のいずれかを1アイテム目に入れた場合に、意図せずこちらの例外レシピになってしまう可能性がある、という点です(裏返せば、これ以外のアイテムを1つ目に入れれば、前述のレシピの作り方に則る、ということです)。自らレシピを検討するときは気をつけましょう。

ガンテツボールレシピ(ぼんぐり4つ)

ウッウロボでは、投入したアイテム4つの「ポイント」合計が0pt、すなわち「ぼんぐり」を4つ入れた場合に、ボール(稀にガンテツボール)が生成されます。この時に生成されるボールの種類は、入れたぼんぐりの色に応じて下記の表のようになります。

ガンテツボールレシピ(同じ「ぼんぐり」4つを入れた場合の排出確率)
確率

f:id:tangential_star:20211106212843p:plain

くろぼんぐり

f:id:tangential_star:20211106212852p:plain

あおぼんぐり

f:id:tangential_star:20211106212930p:plain

しろぼんぐり

f:id:tangential_star:20211106212912p:plain

みどぼんぐり

f:id:tangential_star:20211106212939p:plain

ももぼんぐり

f:id:tangential_star:20211106212949p:plain

あかぼんぐり

f:id:tangential_star:20211106213000p:plain

きぼんぐり
約1%

f:id:tangential_star:20211106213024p:plain

ヘビーボール

f:id:tangential_star:20211106213034p:plain

ルアーボール

f:id:tangential_star:20211106213051p:plain

スピードボール

f:id:tangential_star:20211106213103p:plain

フレンドボール

f:id:tangential_star:20211106213114p:plain

ラブラブボール

f:id:tangential_star:20211106213125p:plain

レベルボール

f:id:tangential_star:20211106213137p:plain

ムーンボール
約25%

f:id:tangential_star:20211106213149p:plain

ゴージャスボール

f:id:tangential_star:20211106213157p:plain

ネットボール

f:id:tangential_star:20211106213205p:plain

プレミアボール

f:id:tangential_star:20211106213218p:plain

ネストボール

f:id:tangential_star:20211106213230p:plain

ヒールボール

f:id:tangential_star:20211106213239p:plain

リピートボール

f:id:tangential_star:20211106213246p:plain

クイックボール
約25%

f:id:tangential_star:20211106213257p:plain

ダークボール

f:id:tangential_star:20211106213305p:plain

ダイブボール

f:id:tangential_star:20211106213316p:plain

タイマーボール

f:id:tangential_star:20211106213325p:plain

ハイパーボール

f:id:tangential_star:20211106213325p:plain

ハイパーボール

f:id:tangential_star:20211106213325p:plain

ハイパーボール

f:id:tangential_star:20211106213325p:plain

ハイパーボール
約25%

f:id:tangential_star:20211106213345p:plain

スーパーボール
約25%

f:id:tangential_star:20211106213355p:plain

モンスターボール
約0.1%

f:id:tangential_star:20211106213411p:plain

サファリボール

※ボールの種類の情報はポケモンWikiウッウロボ」より引用。

なお、上記の表は4つとも同じ「ぼんぐり」を入れた場合の確率ですが、2種類以上のぼんぐりを混ぜると、その個数の比に応じた確率が適用されます。例えば、「くろぼんぐり」3つと「あおぼんぐり」1つを入れた場合、「ヘビーボールが0.75%」「ルアーボールが0.25%」になります。また、2個以上のぼんぐりを混ぜた場合には「サファリボール」が排出しなくなり、代わりに「コンペボール」が排出されるようになります。

 

ウッウロボ自動化の事前準備

さて、余談が長くなりました。ここからは、プログラムを使う上での事前準備についてです。とは言っても自分で決めたレシピを設定するだけ、ですが。

ウッウロボのレシピの例・作り方は前述しているので、もし、「何を作るか」が決まっていなければ、適宜上記を振り返っていただければと思います。

プログラム冒頭のレシピ部分を修正する

プログラムで修正するのは、冒頭の部分のみです。

ウッウロボでは、リュックのうち「きのみ」「どうぐ」「おたから」の3ポケットの中から投入アイテムを選べます。プログラムでは使うアイテムをそれぞれ何個ずつ持っているかをnum1, num2, num3, num4に、それぞれがどのポケットの上から何番目にあるのかをrecipe1, recipe2, recipe3, recipe4に書き換えます例えば、「きのみ」ポケットの2番目のアイテムを指定するには「"B2"」と記載します

なお、このプログラムは、原則として「ぼんぐり4つ」以外のレシピ合成用として作成しておりますが、ぼんぐりを4つ入れる場合はALL_APLICORNの「false」を「true」に変更してください*8

// ★ここに、レシピを記入してください!★
// リュックの何番目に使いたいアイテムが入っているかを、下記凡例に沿って記入。
// きのみ=B(Berries) / どうぐ=I(other Items) / おたから=T(Treasure)
// 例:「きのみ」欄の一番上→ B1 , 「どうぐ」欄の上から15番目→ I15 , 「おたから」欄の上から5番目→ T5
char* recipe1 = "I2"; int num1= 817; // 1番目に入れる道具とその所持数
char* recipe2 = "T1"; int num2= 926; // 2番目に入れる道具とその所持数
char* recipe3 = "T1"; int num3= 705; // 3番目に入れる道具とその所持数
char* recipe4 = "I4"; int num4= 498; // 4番目に入れる道具とその所持数
const bool ALL_APLICORN = (false);   // アイテム4つがすべて「ぼんぐり」ならtrueに。

一応、プログラム上は上から何番目かが正しく指定されていれば、20番目でも30番目でも参照できるように作っていますが、ご自身が数え間違えるリスクもあるので、極力「お気に入り」「並び替え」機能を使ってリュックの上の方に置いておくと便利&安心です。

また、上記の例にもありますが、同じアイテムを複数回入れることも可能です。例えば、recipe1, recipe2で同じアイテムを入れる場合は、それぞれ同じ記号・同じ数量を指定してください。

f:id:tangential_star:20211106230950p:plain
f:id:tangential_star:20211106230956p:plain
プログラムソースの変更例(レシピは「レッドカード」のもの)
「きのみ1番目」「どうぐ1番目」それぞれを"B1"と"I1"でプログラムに書き込む


リュックのカーソルをすべて一番上にして「かいふく」ポケットを開く【重要】

続いて、ポケモン剣盾側の準備ですが、こちらはいたってシンプル。

道具ポケットのすべてのカーソル(選択しているアイテム)を一番上」になるようにして『かいふく』ポケットを開いた状態」にする(両方とも重要)にするだけです。

この手順をうっかり忘れると、自動化した際に道具選択がずれるため、意図しないアイテムを消費してしまい、セーブまでされてしまいます。取り返しがつかないので、必ず確認してください。

f:id:tangential_star:20211106232207g:plain

リュックですべてのカーソルを「一番上」にして「かいふく」ポケットを開いておく
これを忘れると、誤ったアイテムが選択され、あわや大惨事に(セーブされてしまう)。

 

プログラムのソースコード

ウッウロボの目の前でArduinoを差し込むだけで使用できるカンタン仕様です。事前にソースコード中の「recipe1」~「recipe4」および「num1」~「num4」を書き換えてお使いください。また、リュックのカーソルはすべてのポケットで先頭にした上で、「かいふく」ポケットを開いた状態にしてからご利用ください(重要)。

/*  ★★★★★★★★★★★★★★★★
 *  ★ウッウロボ自動投入プログラム★
 *  ★★★★★★★★★★★★★★★★
 *  
 * ウッウロボにアイテムを自動で入れてくれます。
 * たとえば「アメざいく」「わざレコード」など、複数欲しいものや厳選が必要なものをウッウロボで大量回収する際にお役立てください。
 * ※いちおう、ぼんぐり4つでのガンテツボール厳選にも使えます(素直にA連打のほうが効率が良い気もしますが)。
 *  
 *  【事前準備】
 *  リュックのカーソルをすべて1番目に戻しておき、きのみを開いた状態で閉じておきます(重要)。
 *  プログラム内の「recipe1」~「recipe4」に、ウッウロボに入れる道具の位置を入れておきます。
 *  あわせて「num1」~「num4」に、それぞれの所持数(=使用上限数)を入れます。
 *  ※「1個」しか所持していないアイテムは利用できません(手動でやってください)
 *  ※プログラム上は、1個以上残るようにアイテムを消費する設計(途中で止まる設計)になっています。
 *  ※万が一、貴重なアイテムが消費されても責任は持てません。「自己責任」でお願いします。
 *  
 *  【利用方法】
 *  ウッウロボの目の前でArduinoを差し込むだけです。
 *  ※セーブされるので、自己責任でお願いします。
 *  
 *  (c) 2021 ますたーの忘備録
 *  https://tangential-star.hatenablog.jp/
*/

#include <SwitchControlLibrary.h>

#define HOLDTIME (95) // 1回のキー入力の長押し時間

// ◆レシピの簡易説明◆
// ウッウロボから出てくるアイテムは「1番目に入れたアイテムに割り当てられた属性テーブル」から排出されるようになります。
// (例えば「あかぼんぐり」は「ほのおタイプ」、「かわらずのいし」は「いわタイプ」など)
// また、隠しパラメータとしてアイテムごとにポイント(レア度みたいな)があり、これの合計で出てくるアイテムが決定されます。
// ぼんぐりはポイントが「0」で設定されており、合計0だとボールになる、みたいな仕組みです。
// 下記は、レシピの例です。※カッコ書きのパラメータ[]は、ポケモンWiki様よりお借りしました
// 【ポケモンWiki】ウッウロボ https://wiki.xn--rckteqa2e.com/wiki/%E3%82%A6%E3%83%83%E3%82%A6%E3%83%AD%E3%83%9C
// 
// ●アメざいく(スター・リボン)[57]
//    =[ひかり/つきのいし(3)]+[きん/ぎんのおうかんorふしぎなアメ(20)]+[きん/ぎんのおうかんorふしぎなアメ(20)]+[マックス/ヨロイこうせき(14)]
// ●アメざいく(その他) [46]
//    =[ひかり/つきのいし(3)]+[ひかり/つきのいし(3)]+[きん/ぎんのおうかんorふしぎなアメ(20)]+[きん/ぎんのおうかんorふしぎなアメ(20)]
// ●においぶくろ [29]
//    =[ひかり/つきのいし(3)]+[ひかり/つきのいし(3)]+[ひかり/つきのいし(3)]+[きん/ぎんのおうかんorふしぎなアメ(20)]
// ●ホイップポップ [38]
//    =[ひかり/つきのいし(3)]+[クラボ/カゴ/モモン/オレンのみ(1)]+[きん/ぎんのおうかんorふしぎなアメ(20)]+[マックス/ヨロイこうせき(14)]

// ★ここに、レシピを記入してください!★
// リュックの何番目に使いたいアイテムが入っているかを、下記凡例に沿って記入。
// きのみ=B(Berries) / どうぐ=I(other Items) / おたから=T(Treasure)
// 例:「きのみ」欄の一番上→ B1 , 「どうぐ」欄の上から15番目→ I15 , 「おたから」欄の上から5番目→ T5
char* recipe1 = "I2"; int num1= 817; // 1番目に入れる道具とその所持数
char* recipe2 = "T1"; int num2= 926; // 2番目に入れる道具とその所持数
char* recipe3 = "T1"; int num3= 705; // 3番目に入れる道具とその所持数
char* recipe4 = "I4"; int num4= 498; // 4番目に入れる道具とその所持数
const bool ALL_APLICORN = (false);   // 【非推奨!】アイテム4つがすべて「ぼんぐり」ならtrueに。(ぼんぐりを入れる場合にはA連打をご検討ください)


// ★上級者向け設定★
// Arduinoがメモリアロケーションに失敗した時、動作を継続するかどうか。
// このプログラムでは、上記レシピの道具の残数を、動的メモリ確保でリスト化して管理します。
// この動的メモリ確保に失敗した場合に、このプログラムの動作を止めるかどうかです。
// ※Arduinoを挿したらすぐにHome画面に入ってしまう方は、Arduinoがメモリ確保に失敗しています。
// アイテムの残数は自分で適宜画面で確認する、という方はfalseにしてください(自己責任)
const bool STOP_PROGRAM_WHEN_ERROR = (true); 


// アイテム重複確認用のリスト構造体
struct t_item_list{
  char keyname[5]; // "I1"など、任意のなまえ
  int num; // 残り個数
  int use; // 1回の試行で使う数(重複がなければ「1」)
  struct t_item_list* next;
};
// 便宜的な配列添字(リュックの中身)
const int B =0;
const int I =1;
const int T =2;
// リュックのカーソル位置
int target = B; // 初期オープン位置→「きのみ」
int cur[3] = {1, 1, 1}; // 「きのみ」「どうぐ」「おたから」それぞれの初期カーソルの位置。

// アイテム残り数を保存するリスト
struct t_item_list* restitem = NULL;
bool BAD_ALLOCATION = false;

// 作った関数たち
void PushRL(int delay_time_ms);
int PushKey(char* keyname, int holdtime, int delaytime);
struct t_item_list* search_sameitem(char *recipe, struct t_item_list* searchindex);
struct t_item_list* search_lastitem(struct t_item_list* searchindex);
bool can_use_item(struct t_item_list* searchindex);
int update_itemlist(struct t_item_list* searchindex);

void setup() {
  // コントローラーとして認識されるためにRLを7回ほどカチャカチャする
  for(int i=0;i<7;i++)PushRL(300);
  delay(1000);

  struct t_item_list* temp;


  // 道具の正式な量を把握 -----------------------------------------

  // recipe1を登録
  restitem = malloc( sizeof(struct t_item_list) );
  if(restitem == NULL){
    BAD_ALLOCATION = true;
    if(STOP_PROGRAM_WHEN_ERROR){
      PushKey("Home", HOLDTIME, 1200);
      for(;;); // 動作終了。
    }
  }else{
    strcpy( restitem->keyname, recipe1);
    restitem->num = num1;  // 残り個数を保存
    restitem->use = 1;     // 消費数を保存
    restitem->next = NULL; // 次のキーはnull
  }

  // recipe2を登録
  if(search_sameitem(recipe2, restitem) == NULL){ // 同一アイテムが無い場合は末尾に追記
    temp = search_lastitem(restitem); // 2個目以降は、リスト最後のnextにmallocする
    temp->next = malloc( sizeof(struct t_item_list) );
    if(temp->next == NULL){
      BAD_ALLOCATION = true; 
    }else{
      strcpy( temp->next->keyname, recipe2);
      temp->next->num = num2;  // 残り個数を保存
      temp->next->use = 1;     // 消費数を保存
      temp->next->next = NULL; // 次のキーはnull
    }
  }else{ // 重複アイテム発見時は…
    temp = search_sameitem(recipe2, restitem);
    temp->use = temp->use + 1; // アイテム消費数を追加
  }

  // recipe3を登録
  if(search_sameitem(recipe3, restitem) == NULL){ // 同一アイテムが無い場合は末尾に追記
    temp = search_lastitem(restitem); // 2個目以降は、リスト最後のnextにmallocする
    temp->next = malloc( sizeof(struct t_item_list) );
    if(temp->next == NULL){
      BAD_ALLOCATION = true; 
    }else{
      strcpy( temp->next->keyname, recipe3);
      temp->next->num = num3;  // 残り個数を保存
      temp->next->use = 1;     // 消費数を保存
      temp->next->next = NULL; // 次のキーはnull
    }
  }else{ // 重複アイテム発見時は…
    temp = search_sameitem(recipe3, restitem);
    temp->use = temp->use + 1; // アイテム消費数を追加
  }

  // recipe4を登録
  if(search_sameitem(recipe4, restitem) == NULL){ // 同一アイテムが無い場合は末尾に追記
    temp = search_lastitem(restitem); // 2個目以降は、リスト最後のnextにmallocする
    temp->next = malloc( sizeof(struct t_item_list) );
    if(temp->next == NULL){
      BAD_ALLOCATION = true; 
    }else{
      strcpy( temp->next->keyname, recipe4);
      temp->next->num = num4;  // 残り個数を保存
      temp->next->use = 1;     // 消費数を保存
      temp->next->next = NULL; // 次のキーはnull
    }
  }else{ // 重複アイテム発見時は…
    temp = search_sameitem(recipe4, restitem);
    temp->use = temp->use + 1; // アイテム消費数を追加
  }

  delay(1000);

  // mallocに失敗していたらプログラムを中断。
  if(STOP_PROGRAM_WHEN_ERROR && BAD_ALLOCATION){
    PushKey("Home", HOLDTIME, 1200);
    for(;;); // 動作終了。
  }
  
}


void loop() {

  // ★ウッウロボに話しかける
  PushKey("A", HOLDTIME, 800);  //  
  PushKey("A", HOLDTIME, 800);  // メニューを 選んでください ▼
  PushKey("A", HOLDTIME, 1300); // →合成する
  PushKey("A", HOLDTIME, 1500); // 合成に 使う 道具を 選んでください ▼

  // ★道具選択画面

  // 投入アイテムの残数チェック
  if(!BAD_ALLOCATION){ // ただしくmallocできていれば有効。
    if(can_use_item(restitem)){
      // 所持アイテムが十分な数であればアイテム数をへらす
      update_itemlist(restitem);
    }else{
      // 不十分の場合は、ゲーム中断
      PushKey("Home", HOLDTIME, 1200);
      for(;;); // 動作終了。
    }
  }


  // 投入するアイテム1つ目----------------------------------------

  // リュックのカーソル合わせ
  switch( tolower(recipe1[0]) ){ // 「きのみ」「どうぐ」「おたから」カーソル合わせ
    case 'b': // きのみ
      if(target == I) PushKey("left", HOLDTIME, 800);
      if(target == T) PushKey("right", HOLDTIME, 800);
      target = B;
      break;
    case 'i': // どうぐ
      if(target == T) PushKey("left", HOLDTIME, 800);
      if(target == B) PushKey("right", HOLDTIME, 800);
      target = I;
      break;
    case 't': // おたから
      if(target == B) PushKey("left", HOLDTIME, 800);
      if(target == I) PushKey("right", HOLDTIME, 800);
      target = T;
      break;
    default: break;
  }

  // どうぐへのカーソル合わせ
  while( cur[target] != atoi(&recipe1[1]) ){ // 数字部分と比較(0文字目は符号B,T,Iいずれかなのでatoiには[1]から渡している)
    if( cur[target] < atoi(&recipe1[1]) ){
      PushKey("down", HOLDTIME, 280);
      cur[target]++;
    }
    if( cur[target] > atoi(&recipe1[1]) ){
      PushKey("up", HOLDTIME, 280);
      cur[target]--;
    }
  }
  PushKey("A", HOLDTIME, 400);


  // 投入するアイテム2つ目----------------------------------------
  // リュックのカーソル合わせ
  switch( tolower(recipe2[0]) ){ // 「きのみ」「どうぐ」「おたから」カーソル合わせ
    case 'b': // きのみ
      if(target == I) PushKey("left", HOLDTIME, 800);
      if(target == T) PushKey("right", HOLDTIME, 800);
      target = B;
      break;
    case 'i': // どうぐ
      if(target == T) PushKey("left", HOLDTIME, 800);
      if(target == B) PushKey("right", HOLDTIME, 800);
      target = I;
      break;
    case 't': // おたから
      if(target == B) PushKey("left", HOLDTIME, 800);
      if(target == I) PushKey("right", HOLDTIME, 800);
      target = T;
      break;
    default: break;
  }

  // どうぐへのカーソル合わせ
  while( cur[target] != atoi(&recipe2[1]) ){ // 数字部分と比較(0文字目は符号B,T,Iいずれかなのでatoiには[1]から渡している)
    if( cur[target] < atoi(&recipe2[1]) ){
      PushKey("down", HOLDTIME, 280);
      cur[target]++;
    }
    if( cur[target] > atoi(&recipe2[1]) ){
      PushKey("up", HOLDTIME, 280);
      cur[target]--;
    }
  }
  PushKey("A", HOLDTIME, 400);

  // 投入するアイテム3つ目----------------------------------------
  // リュックのカーソル合わせ
  switch( tolower(recipe3[0]) ){ // 「きのみ」「どうぐ」「おたから」カーソル合わせ
    case 'b': // きのみ
      if(target == I) PushKey("left", HOLDTIME, 800);
      if(target == T) PushKey("right", HOLDTIME, 800);
      target = B;
      break;
    case 'i': // どうぐ
      if(target == T) PushKey("left", HOLDTIME, 800);
      if(target == B) PushKey("right", HOLDTIME, 800);
      target = I;
      break;
    case 't': // おたから
      if(target == B) PushKey("left", HOLDTIME, 800);
      if(target == I) PushKey("right", HOLDTIME, 800);
      target = T;
      break;
    default: break;
  }

  // どうぐへのカーソル合わせ
  while( cur[target] != atoi(&recipe3[1]) ){ // 数字部分と比較(0文字目は符号B,T,Iいずれかなのでatoiには[1]から渡している)
    if( cur[target] < atoi(&recipe3[1]) ){
      PushKey("down", HOLDTIME, 280);
      cur[target]++;
    }
    if( cur[target] > atoi(&recipe3[1]) ){
      PushKey("up", HOLDTIME, 280);
      cur[target]--;
    }
  }
  PushKey("A", HOLDTIME, 400);

  // 投入するアイテム4つ目----------------------------------------

  // リュックのカーソル合わせ
  switch( tolower(recipe4[0]) ){ // 「きのみ」「どうぐ」「おたから」カーソル合わせ
    case 'b': // きのみ
      if(target == I) PushKey("left", HOLDTIME, 800);
      if(target == T) PushKey("right", HOLDTIME, 800);
      target = B;
      break;
    case 'i': // どうぐ
      if(target == T) PushKey("left", HOLDTIME, 800);
      if(target == B) PushKey("right", HOLDTIME, 800);
      target = I;
      break;
    case 't': // おたから
      if(target == B) PushKey("left", HOLDTIME, 800);
      if(target == I) PushKey("right", HOLDTIME, 800);
      target = T;
      break;
    default: break;
  }

  // どうぐへのカーソル合わせ
  while( cur[target] != atoi(&recipe4[1]) ){ // 数字部分と比較(0文字目は符号B,T,Iいずれかなのでatoiには[1]から渡している)
    if( cur[target] < atoi(&recipe4[1]) ){
      PushKey("down", HOLDTIME, 280);
      cur[target]++;
    }
    if( cur[target] > atoi(&recipe4[1]) ){
      PushKey("up", HOLDTIME, 280);
      cur[target]--;
    }
  }
  PushKey("A", HOLDTIME, 900); // えらんだ 道具を 合成します よろしいですか?

  PushKey("A", HOLDTIME, 1500); // →はい
  PushKey("A", HOLDTIME, 1600); // 合成を 始めるため レポートを 書きますか? →はい
  PushKey("A", HOLDTIME, 4200); // ●●は レポートを しっかり 書き残した ▼
  PushKey("A", HOLDTIME, 7000); // ゴウセイ カンリョウ ▼
  PushKey("A", HOLDTIME, 1200); // ●●は ●● を 手に入れた!
  PushKey("A", HOLDTIME, 1800); // ●●は ●● を ●●ポケットに しまった ▼

  while(ALL_APLICORN){ // 「ぼんぐり」でオシャボ回収の場合はA連打(ループ)
    PushKey("A", HOLDTIME, 1800); // 同じ 組み合わせで 続けて 合成しますか? →はい
    PushKey("A", HOLDTIME, 4200); // ●●は レポートを しっかり 書き残した ▼
    PushKey("A", HOLDTIME, 1200); // ●●は ●● を 手に入れた!
    PushKey("A", HOLDTIME, 1800); // ●●は ●● を ●●ポケットに しまった ▼
    // 投入アイテムの残数チェック
    if(!BAD_ALLOCATION){ // ただしくmallocできていれば有効。
      if(can_use_item(restitem)){
        // 所持アイテムが十分な数であればアイテム数をへらす
        update_itemlist(restitem);
      }else{
        // 不十分の場合は、ゲーム中断
        PushKey("Home", HOLDTIME, 1200);
        for(;;); // 動作終了。
      }
    }
  }


}

void PushRL(int delay_time_ms){
  SwitchControlLibrary().PressButtonR();
  SwitchControlLibrary().PressButtonL();
  delay(HOLDTIME);
  SwitchControlLibrary().ReleaseButtonR();
  SwitchControlLibrary().ReleaseButtonL();
  delay(delay_time_ms);
  return;
}
int PushKey(char* keyname, int holdtime, int delaytime){
  // ホームボタン・方向キーはRight, Left, Up, Down, Homeなど2文字以上で入力。
  // その他ボタン入力は1文字(A,B,X,Y,R,L,+,-)ZR・ZLにも対応
  // 同時押しは非対応
  
  if(strlen(keyname)==1){
    switch(keyname[0]){
      case 'A': case 'a': // A
        SwitchControlLibrary().PressButtonA(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonA(); delay(delaytime);
      break;
      case 'B': case 'b': // B
        SwitchControlLibrary().PressButtonB(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonB(); delay(delaytime);
      break;
      case 'X': case 'x': // X
        SwitchControlLibrary().PressButtonX(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonX(); delay(delaytime);
      break;
      case 'Y': case 'y': // Y
        SwitchControlLibrary().PressButtonY(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonY(); delay(delaytime);
      break;
      case 'L': case 'l': // L
        SwitchControlLibrary().PressButtonL(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonL(); delay(delaytime);
      break;
      case 'R': case 'r': // R
        SwitchControlLibrary().PressButtonR(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonR(); delay(delaytime);
      break;
      case 'H': case 'h': // Home
        SwitchControlLibrary().PressButtonHome(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonHome(); delay(delaytime);
      break;
      case '+': case 'p': case 'P': // Plus
        SwitchControlLibrary().PressButtonPlus(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonPlus(); delay(delaytime);
      break;
      case '-': case 'm': case 'M': // Minus
        SwitchControlLibrary().PressButtonMinus(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonMinus(); delay(delaytime);
      break;
      default:
      break;
    }
  }else if(strlen(keyname)>=2){
    switch(keyname[0]){
      case 'z': case 'Z': // ZR/ZL
        if(keyname[1]=='R'||keyname[1]=='r'){
          SwitchControlLibrary().PressButtonZR(); delay(holdtime);
          if(holdtime>0)SwitchControlLibrary().ReleaseButtonZR(); delay(delaytime);
        }
        if(keyname[1]=='L'||keyname[1]=='l'){
          SwitchControlLibrary().PressButtonZL(); delay(holdtime);
          if(holdtime>0)SwitchControlLibrary().ReleaseButtonZL(); delay(delaytime);
        }
      break;
      case 'r': case 'R': // right
        SwitchControlLibrary().MoveHat(2); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().MoveHat(8); delay(delaytime);
      break;
      case 'l': case 'L': // left
        SwitchControlLibrary().MoveHat(6); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().MoveHat(8); delay(delaytime);
      break;
      case 'u': case 'U': // up
        SwitchControlLibrary().MoveHat(0); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().MoveHat(8); delay(delaytime);
      break;
      case 'd': case 'D': // down
        SwitchControlLibrary().MoveHat(4); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().MoveHat(8); delay(delaytime);
      break;
      case 'H': case 'h': // Home
        SwitchControlLibrary().PressButtonHome(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonHome(); delay(delaytime);
      default:
      break;  
    }
  }else{
    return -1;
  }
  return strlen(keyname);
}

// ★同じアイテムがすでに登録されているかを検索する関数
// input1: keyname(レシピ"I2"など), input2: 対象のリスト
// 返り値: 見つかった場合、そのリストのポインタ、見つからなかった場合はNULL
struct t_item_list* search_sameitem(char *recipe, struct t_item_list* searchindex){
  for(;;){
    if( searchindex == NULL ) return NULL;
    if( strcmp(  searchindex->keyname, recipe) == 0) return searchindex;
    else searchindex = searchindex->next;
  }  
  return NULL;
}

// ★リストの最後のポインタを返す関数
// input: 対象のリスト
// 返り値:リストの最後のポインタ ※NULLが渡されていればNULLを返す。
struct t_item_list* search_lastitem(struct t_item_list* searchindex){
  if( searchindex == NULL ) return NULL;

  while( searchindex->next != NULL){
    searchindex = searchindex->next;
  }  
  return searchindex;
}

// ★リストのキーごとのuseでいずれかが0を下回らないかを確認する関数
// input: 対象のリスト
// 返り値:false:下回る(=使ってはいけない)/true:問題なし。
bool can_use_item(struct t_item_list* searchindex){
  if( searchindex == NULL ) return false;
  do{
    if( searchindex->num - searchindex->use  <= 0 ) return false; 
    searchindex = searchindex->next; // 次のキーに対象を移す
  }while(searchindex!=NULL); // 最後のキーになったら終了
  return true;
}

// ★リストのキーごとのuseを適用する関数
// input: 対象のリスト
// 返り値:成功=0, 失敗=-1
int update_itemlist(struct t_item_list* searchindex){
  if( searchindex == NULL ) return -1;
  do{
    searchindex->num = searchindex->num - searchindex->use; // 減算
    searchindex = searchindex->next; // 次のキーに対象を移す
  }while(searchindex!=NULL); // 最後のキーになったら終了
  return 0;
}

 

本記事についてのあとがき

いかがでしたでしょうか。今回は、ウッウロボに道具を入れ続け、ひたすら道具を生成する自動化プログラムについて紹介しました。

このプログラムを使えば、不要なアイテムを処分しつつ、有用な「わざレコード」や「進化系のアイテム」などに変換し続けることができます。特にマホイップの進化に必要な「アメざいく」はウッウロボで全種類がランダムながらも手に入りますので、コレクターの方にもご利用いただけますね!

ちなみに、筆者は

を回して活用しました。

 

今回の記事では、ブラックボックスだと思われがちな「ウッウロボ」のレシピの仕組みや作り方などを、我ながら上手にまとめられたなと思います。特に、HTMLの「表」と挿入する「絵」をとにかく分かりやすくなるように一つひとつ丁寧に作れたので、きっとご参考いただけるのではないかな、と考えます(めっちゃくちゃ時間かかりましたけどね…プログラミングよりもブログの「レシピ表」作りに時間がかかりました)。

はてなブログを1年間使ってきて、今日初めてstyleタグを記事中に直打ちしてcssが書けることを知りました。スマホユーザーの方が多いので、肥大化しがちな表をスクロール表示できるように工夫してみました。慣れないHTMLとCSSで大変でしたが、それっぽくなったので良かったです。

また、プログラムにおいては、C言語でよく使われる「構造体」と「リスト」を活用し、持っている道具の個数を管理する工夫を加えており、プログラミングスキルという意味でも着実に伸びているような気がしています(本職じゃないのでアレですが…)。Arduinoでも動的メモリ確保用の関数「malloc」が使える、というのが今回の発見で一番大きい学びでした(ついでにnullじゃなくてNULL(大文字)じゃないとダメとかも学びました)。

 

これからも、のんびりと学びながら、のんびりと更新していけたらと思います。引き続きよろしくお願いいたします。

 

あとがき(1周年記念!ありがとうございます!!)

さて、改めてになりますが、本日2021年11月7日(日)は、本ブログを始めた2020年11月7日からちょうど1年目となる節目の日となります。

当初は自らの趣味で、文字通り「忘備録」として始めた本ブログでしたが、1年が経過した今では、総PV数は50,000を超え、先月には初めて「単月PV」が10,000PVを突破するなど、お陰様でたくさんの方々にご覧いただけていて非常に嬉しく思います

f:id:tangential_star:20211107000527p:plain

2021年11月7日午前0時00分時点での総PV数は「53,832PV」だった

この記事を含めれば、「ポケモン剣盾Arduino自動化」カテゴリの記事は22記事目、リライト記事(ex)を含めれば25記事目となります。さらには、「ポケモン自動化番外編」の記事・レジンキーキャップの記事を含めれば、実に31記事も更新していることになりますこの1年間でこれほどブログ更新ができていることに我ながら感動を覚えます

そして何よりも温かいコメントもたくさん頂戴しており一重に皆様の支えがあったからこそこうして1年を迎えられたんだろうなぁと痛感しております。この場を借りて御礼申し上げます。

これからも本ブログを温かく見守っていただければ幸いですし、よければお知り合いにも紹介いただいたり、コメントをいただけますと励みになりますもちろん、なにかリクエストがあれば(多忙ゆえできるかはわかりませんが)検討させていただきたく思いますので、そういったものもコメントでいただければと思います。

 

それでは、改めて、本ブログが本日11/7に1年を迎えられたことを記念して、感謝を込めて本記事を結ばせていただきます。

 

ではでは~c⌒っ.ω.)っ

 

#p.s.

今月の19日にはポケモンBDSPの発売日が控えていますね。私としては、まだまだ剣盾も自動化ニーズは高まるばかりですし、これからもぼちぼち剣盾を遊びながら、BDSPを楽しみたいなと考えます(それにしても有機ELモデルの新型Switch、何回もニンテンドーストアで予約抽選していますが、1度たりとも購入できません…転売ヤー勘弁してくれ…)。

 

前回記事:【Arduino自動化21】自動ドロップアイテム回収【ミント島でミント集め】

導入記事:【Arduino自動化01】Arduino開発環境の導入

関連記事:【Arduino自動化10】きのみ・ぼんぐり自動回収

他のArduino自動化:ポケモン剣盾Arduino自動化 カテゴリーの記事一覧

YouTubeチャンネル:ますたーの忘備録 - YouTube 【NEW!!】

---

*1:ウッウロボから出るアイテム180種類の内訳は、「わざレコード」の100種類すべて(00番~99番)、「じゃくてんほけん」などの汎用アイテム、「アメざいく」などの進化アイテムなど

*2:ウッウロボの仕組みには例外もあります。ぼんぐりを4つ入れた場合や、1・3・4番目に所定のアイテムを入れた場合など、この仕組みに則さない場合があります

*3:ウッウロボの生成アイテムは、タイプ18種×ポイント15段階=270パターンになるが、うち100種類は「わざレコード」で、同じアイテムができるパターンも含まれるため、アイテムの種類としては180種類程度になる

*4:ウッウロボに入れた時の換算ptには規則性があり、6,7世代の「しぜんのめぐみ」での威力の決まり方と連動します。具体的には「威力80になるきのみ=1pt」、「威力80になる『混乱きのみ』『半減きのみ』=2pt」「威力90になるきのみ=3pt」「威力100になるきのみ=5pt」

*5:例えば、入手困難なアイテム「くちたたて」は「はがね・1pt」だが、それを使うくらいなら「リリバのみ(はがね・2pt)」を使ったほうが望ましい

*6:原則としてウッウロボに入れるアイテムの2~4番目は順不同です。

*7:「ほしのかけら」は例外レシピがあり、1番目・3番目・4番目に入れると「すいせいのかけら」になってしまいます

*8:ぼんぐりを合成し続ける場合は、単純にA連打のほうが効率が良いです