コンテンツにスキップ

RG351MPの小さな画面でDRLを拡大して遊ぶ

AIと作った拡大機能の記録 / 2026年10月28日 実機で完成

RG351MPの画面は3.5インチです。ローグライクのDRL(旧DoomRL)を遊ぶと、主人公や敵がとても小さく見えます。そこで、L3ボタンで画面を拡大し、右スティックで見る場所を動かせる機能を、AIと一緒に作りました。

完成までに、うまくいかなかったことが何度もありました。その過程も含めて残します。

完成したもの

左がふつうの画面、右が拡大した画面

左がふつうの画面、右が拡大した画面です。主人公のドットまで、はっきり見えます。

ボタン 動作
L3(左スティックの押し込み) 2倍 → 3倍 → 元に戻す
右スティック 拡大中に見る場所を動かす(倒している間、なめらかに動き続ける)
  • 拡大した画面は、色を混ぜない方法で描いています。ドットがぼやけません。
  • ゲームの操作は、これまでどおり使えます。

ゲームは改造していない

今回作ったのは、ゲームの外から画面を拡大する「部品」です。

変えたもの 中身
拡大用の部品(drl_zoom.so) 一から書いたプログラム。ゲームが描いた画面を拡大して表示する
起動用のファイル(DoomRL.sh) 部品を読み込む1行を足した
ボタンの設定(drl.gptk2) 空いていたL3と右スティックに、拡大用のキーを割り当てた

ゲームのプログラムやデータには、手を入れていません。画面の前に虫眼鏡を置いたようなものです。

きっかけ: ScummVMにはすでにあった

この端末では、ScummVMのアドベンチャーゲーム(Beneath a Steel Skyなど)で、L1を押すと拡大できるようにしてありました。同じことをDRLでもできないか、というのが始まりです。

DRLの設定には、マスの大きさを変える項目(tile_multiplier)があります。ただ、これは固定の設定で、ボタンで切り替えるものではありません。2倍にしてみると、マップの見える範囲が狭くなり、ゲームでは不利になりました。必要なときだけ拡大できる仕組みが欲しい、と考えました。

うまくいかなかったこと

完成まで、10回以上作り直しました。主なつまずきを順に書きます。

1. 右スティックの「下」と「左」が効かない

右スティックの4方向に、F8〜F11のキーを割り当てました。上と右は動くのに、下と左はまったく反応しません。

記録を取って調べると、F9とF10のキーが、この端末ではゲームまで届いていませんでした。ボタンを変換するプログラムはキーを送っています。自分で仮想キーボードを作ってF8・F9・F11を押してみても、F8とF11だけが届き、F9は届きませんでした。どこで止められているかは分かりませんでしたが、下と左をF7とF6に変えて解決しました。

2. 倒したままでも、少ししか動かない

ボタンの変換プログラムは、スティックを倒したときに1回、戻したときに1回しかキーを送りません。そこで、部品の側で「今どの方向に倒されているか」を覚えて、時間に合わせて動かし続けるようにしました。

3. 主人公が勝手に歩き出す

いちばん苦労したのがこれです。十字キーで一歩動いたあと、拡大して右スティックを倒すと、主人公が最後に動いた方向へ歩き続けてしまいます。

最初は、部品がゲームを起こして画面を描き直させる仕組みが原因だと考えました。そこで、ゲームが描いた画面を毎回写し取っておき、拡大中は部品が自分で描き直す作りに変えました。ゲームを起こす必要がなくなります。それでも、主人公は歩き続けました。

4. テンキーは使えない

キーをテンキー(8・2・4・6)に変えたこともあります。ところが、DRLは昔のローグライクと同じく、テンキーを移動キーとして使います。右スティックを倒すと、今度は主人公がその方向に歩きました。

5. 十字キーが効かなくなる

拡大用のキーをゲームから見えなくしようとしたら、今度は十字キーが効かなくなりました。

本当の原因

記録を細かく取って、ようやく分かりました。

DRLは、入力が来ているかを確かめるとき、入力の待ち行列の先頭を、取り出さずにのぞいています。

  • 拡大用のキーが先頭にあると、DRLは「キーが押されている」と思い、最後の移動を繰り返していました(主人公が勝手に歩く)。
  • 拡大用のキーを、のぞいたときだけ見えないようにすると、キーは先頭に残ったままです。DRLは「何も来ていない」と思って入力を取り出さず、後ろに並んだ十字キーが詰まっていました(十字キーが効かない)。

そこで、DRLが入力を確かめる前に、毎回、待ち行列から拡大用のキーだけを取り除くようにしました。拡大用のキーは、部品がキーボードの状態から直接読んでいるので、待ち行列から消しても困りません。

これで、拡大、スクロール、ふつうの操作が、すべてうまく動くようになりました。

使えるゲーム、使えないゲーム

この部品は、DRL専用に作っています。ほかのゲームでは、そのままでは動きません。

この端末に入っているPortMasterのゲームを調べると、画面の描き方は主に2種類でした。

描き方 ゲーム この部品
OpenGLで直接描く DRL 使える
SDLのレンダラーで描く Ultima VI(Nuvie)、Seven Kingdoms、Fallout、OpenTyrianなど 作り直しが必要

レンダラーで描くゲームは、小さな画面を引き伸ばして表示していることが多いので、別の方法で拡大できる見込みがあります。次に挑戦してみます。

元に戻すには

変えたファイルは、すべてバックアップしてあります。

  • ports/DoomRL.sh.bak-20261028 を DoomRL.sh に戻す
  • ports/doomrl/drl.gptk2.bak-20261028 を drl.gptk2 に戻す

これだけで、拡大のない元の状態に戻ります。

試すときは自己責任で

端末の設定ファイルを書き換えます。必ずバックアップを取ってから試してください。部品のソースコードは、公開の準備ができたらこのサイトで案内します。

まとめ

  • RG351MPの小さな画面でも、L3で拡大、右スティックでスクロールして、DRLのドットを大きく見ながら遊べるようになった
  • ゲーム本体には手を入れず、外から画面を拡大する部品を作った
  • 「主人公が勝手に歩く」原因は、DRLが入力の待ち行列の先頭をのぞく仕組みにあった
  • この端末では、F9とF10のキーがゲームまで届かない

画像について

DRLの画像(タイル)は Derek Yu さん、Łukasz Śliwiński さんの作品で、CC BY-SA 4.0 です。