防御択を勝手に選ぶ機

最近見た動画で感心したのがあって、それを実践してみようということで道具をこさえた。
動画はこれ。


かいつまんでいうと、防御択の配分を決めといて、残り時間とかの秒数で自動的に選択するってすればいいんじゃない?っていう話。
暴れは1割って決めてても、うっかり暴れちゃったりするわけじゃん。そのへんを「頑張る」から解放して、機械的に決めちゃう。
わたしの場合は「残り時間の末尾3。。。えーとえーと、ガードで~」とかやってると間に合わないので、勝手にルーレット表示する道具を作って、モニタの下とかで光らせといたらいいんじゃないのと思っている。

つくるか。

とりまアリエク

これはUSB接続できるマイコンで、しょぼいPythonなら動く。
こいつに画像ファイルをわたしておき、いい感じにルーレットし続ける動作を書いてやればいいのだ。
自分がダウンしたぞーとかの時にちらっと見て、書いてある内容を防御択とする。自分の意思を介在させず、事実上のランダムにしてしまう。

最速投げ暴れをして負け続ける、愚かな自分を救う日が来たのだ。

画像を用意する

Fireworksでスライス。適当な防御択のカードを作っておく。
枚数やたらあるけど、実際に選ぶのは3個くらいだと思う。思いつきで書いてるだけ。

しょぼいチップにPNG(Deflateアルゴリズムで圧縮されてる)を展開させるのは酷だよという話なので、バイト列に直すツールを書く。
アリエクに注文したやつは忘れた頃に届くので、しばらく実機では何も試せない。コードを書くだけ書いて、micropythonじゃなくても動作確認できるとこを揃えちゃおう。

たんにパラパラ出されると頻度が均等になるので、出現頻度も渡す。
今回使うやつはwaveshare社のESP32-C6って製品なので、これのピン番号とかを調べて、pythonコードをわらわら書いた。
手元に実機がないのでいったん書いただけ。
これで2~3週間は塩漬け。届いたら続きをやろう。

届いた

想定した以上に到着が速い。さっそくコード書く。
私はふだんローカルのWindowsとか、GCPみたいなクラウドで暮らしている身分なので、マイコンのイロハはまったくわからない。わりと見様見真似というか。

書いたコードはどうやって転送すんのかな?
Thonnyってソフトウェアがあって便利らしい。
オロオロしながら適当にメニュー選んで接続、うまくいかんなとかいうときはESP32側のリセットボタンを押したりした。適当。

COM何番になるとかは環境によって変わるっぽいとにかく、こいつを使ってスクリプトや画像データをアップロードして、リセットして動作確認、って手順を繰り返す。

st7789py

MicroPython LCD Driver in Python って素敵なライブラリがある。
なにがいいって、microPythonみたいな貧弱な環境だとpipインストールもままならんので、ファイル(lib/st7789py.py)をぽんと置けばいいだけの提供をしてくれてるのはかなり便がいい。
そのままだと定義されてる解像度の一覧にサポートがないので少し編集する。

_DISPLAY_172x320 = (
    (0x60, 320, 172, 0, 34, False),  # rotation 0
    (0xe0, 320, 172, 0, 34, False),  # rotation 1
    (0x20, 320, 172, 0, 34, False),  # rotation 2
    (0xa0, 320, 172, 0, 34, False),  # rotation 3
)

こんなのを書き足した。
※34はこのパネル固有の物理的なオフセットらしいです。ST7789チップのメモリは320×240のフル解像度で設計されてるんだけど、そのうち最初の34列を使ってない、って話みたい。

# Supported displays (physical width, physical height, rotation table)
_SUPPORTED_DISPLAYS = (
    (240, 320, _DISPLAY_240x320),
    (240, 240, _DISPLAY_240x240),
    (135, 240, _DISPLAY_135x240),
    (128, 128, _DISPLAY_128x128),
    (320, 172, _DISPLAY_172x320),
    )

定義の列の中に入れておく。
補足:st7789py.ST7789の呼び出しの時にrotationって引数があって、そこに0~3だかの値を入れると云々って話が出てくる。縦で使うとかの用途の時にあらためて困ればいいんじゃね、という態度であるゆえ、上の定義が正しいことを保証しないです。

罠っぽい引っかかり方をした

買ってきたESP32-C6は、電源を入れた直後はデモ画面がでている。こいつが縦型で使う見せ方になっていたことから、画像を回転させてから転送するとか、いろいろ迷子になって時間を使った。
少なくとも買ったこいつに関して言えば、物理的には縦長(幅172 × 高さ320)のパネル。
ただしWaveshareの基板では横向きに実装されているので、ST7789での呼び出しの際も (320, 172)

として、論理的な幅320、高さ172の横長ディスプレイとして扱うという結論になった。ラスター状に崩れたり、画像が見切れたり、表示周りでけっこう悩まされた。
なにしろマイコンをまともに扱う経験もないし、ましてや液晶に何かを描くなんてしたことなかったので。

稼働

動くものができた。

歌広さんとMOVさんの会話にあった、防御択サイコロつくった
ガード多めにしよう、とかもできる
モニタ下とかに貼って、起き上がりの時にチラ見する予定 pic.twitter.com/XHOgjNJ6ms

— はりぺこ (@halipeco) April 24, 2026

わりと感動してしまい、そのままTwitterにも投稿しちゃった。浮かれ過ぎだろ。
この状態のときは液晶のバックライトはビッカビカで明るいし、発熱も高かった。
あれこれ調べて、

  • Wifi機能をOFF
  • CPUクロックを限界まで落とす
  • バックライトの輝度もギリギリまで落とす

どれもちゃんと寄与したが、とりわけ輝度を落としたのはけっこう大きかったかも。最初が最大輝度の1023かなんか、これを64(6.25%)まで落としたことで、ほぼ常温にまで改善した。
Claude曰くWifi切るのが一番貢献してるはずだと言ってたので、そうかもしんない。

実は少しするとタッチ対応モデルも到着しちゃうので、タッチするたびにサイコロのセットが切り替わるとかもやりたい。
たとえばベガとかアレックスならパナす選択肢ってあんまないけど、道着ならOD昇竜も選択肢じゃんね、みたいな。
アレックスはバクステ遅いから選択肢から外そうか、みたいな。
しらんけど。

これでほぼ電気を食わない子になったので、たとえばスマホとかから給電して表示させるとかをしても負担がかからなくなった。いいのでは~?

余談:

メイン処理のPythonクラスの名前はMovDiceにしました。
リスペクトというにはささやかですけども。

追記:タッチモデルもやった

タッチ対応のモデル(ESP32-C6-Touch-LCD-1.47)も届いた。


裏面で光ってるLEDを消せないらしくて困っている画面をタッチすると、キャラごとの選択肢テーブルを切り替えるようにした。
ベガ:ガード多め、バクステ、グラップ、小技暴れ
サガット:ガードとバクステ多め、パナし、小技暴れ
みたいな設定に一旦している。適切かどうかとかはいいんだ設定の話だから。
いちおうタッチで切り替わりができるようになり、表示中の選択肢がどのキャラ用なのかを表示に含められるようにまでなった。
だいたい完成したんではないか。

実際の用途としては、たまにチラ見しておいて「次ダウンしたときはバクステするか」って決めとくみたいな感じ。
バクステとでたのに無視して負けるってのを最近体験したので、以降は真面目に言うことを聞くようになった。
投げ暴れは明確に減っている。勝率はそんなでもない。