Mesenのスクリプトを使って、ドルアーガの搭にLIFEゲージを追加してみる

ファミコンエミュレーターのMesenはとても高機能です。ファミコンゲームの開発でも助かる機能が豊富にあります。その一つであるスクリプト機能について説明します。以前よりLuaが使えることは知っていたのですが、面倒だったのでスルーしてたんですよね…。せっかくなので挑戦してみようと思います。

とりあえずタイトル通りに、『ドルアーガの搭』にLIFEゲージを追加してみようと思います(HPの方が短いし、今ではLIFEって書かないことが多い気もしますが、なんとなくLIFEの方が当時感があるのでLIFEにしました)。

まずはMesenのデバッグメニューからScript Window(Ctrl+N)を選択し、ウィンドウを呼び出します。デフォルトではサンプルが書かれていますが新規スクリプトを作成してクリアしちゃってください。空のスクリプトウィンドウができたら、以下のスクリプトをコピペしてください。

function druaga_disp_hp()
    cLIFE = emu.read( 0xB2, emu.memType.cpu, false )
    emu.drawString( 10, 200, "LIFE", 0xFFFFFF, 0xFF000000, 1 )
    emu.drawRectangle( 32, 200, cLIFE, 8, 0xFF0000, true, 1 )
    emu.drawRectangle( 32, 200, 64, 8, 0xFFFFFF, false, 1 )
end

emu.addEventCallback( druaga_disp_hp, emu.eventType.endFrame )

emu.displayMessage( "Script", "Druaga script loaded." )

プログラムがある程度わかる方なら、だいたいどういう意味かは想像付くかと思います。ザックリと説明すると…function druaga_disp_hp()は関数の定義です。変数cLIFEにメモリ$B2の内容を入れ、X32,Y200の座標にLIFEをそのまま横幅とした四角と、白い枠を描画しています。LIFEはゲーム開始時は$40なので64が初期値のようです。ヘルメットを取ると2倍になりますが、このスクリプトでは対応していません。どこかに最大LIFE値があればよいのですが見つかりませんでした…。

emu.addEventCallback(...)これは定義した関数がどのタイミングで呼ばれるかを設定しています。この場合はフレーム終了時ですね。

emu.displayMessage(...)これはこのスクリプトが実行時にスクリプトウィンドウにメッセージが表示されます。

とりあえず実行してみましょう。

画像3

スクリプトウィンドウの右向きの三角ボタンでスクリプトを実行します。と、その前にドルアーガの搭が起動させておいてください! 問題なければ以下のようになるはずです。

画像2

簡単ですね! Luaの構文はネットで検索すれば情報を得られると思います。Mesenでのリファレンスはヘルプを参照ください。英語ですが…。

<おまけ>
マトックの使用可能回数を下段に表示してみました。

画像3

スクリプトは以下のような感じです。 

function druaga_disp_hp()
    cLIFE = emu.read( 0xB2, emu.memType.cpu, false )
    emu.drawString( 10, 200, "LIFE", 0xFFFFFF, 0xFF000000, 1 )
    emu.drawRectangle( 32, 200, cLIFE, 8, 0xFF0000, true, 1 )
    emu.drawRectangle( 32, 200, 64, 8, 0xFFFFFF, false, 1 )
 
    hasCopperMattock = emu.read( 0x0481, emu.memType.cpu, false )
    hasSilverMattock = emu.read( 0x0487, emu.memType.cpu, false )
    hasGoldMattock = emu.read( 0x049D, emu.memType.cpu, false )
    mattock_num = emu.read( 0xEC, emu.memType.cpu, false )
    if hasGoldMattock > 0 then
        emu.drawString( 66, 217, "Inf", 0xFFFFFF, 0xFF000000, 1 )
    elseif hasSilverMattock > 0 then
        emu.drawString( 72, 217, 4-mattock_num, 0xFFFFFF, 0xFF000000, 1 )
    elseif hasCopperMattock > 0 then
        emu.drawString( 72, 217, 2-mattock_num, 0xFFFFFF, 0xFF000000, 1 )
    end
end

emu.addEventCallback( druaga_disp_hp, emu.eventType.endFrame )

emu.displayMessage( "Script", "Druaga script loaded." )

メモリを覗いてゲームの状態を取得できれば、メインゲーム中以外は非表示にしたりしたいですね~。

ゲーム開発においても、メモリ内の情報をデバッグ出力したりできるので、ゲーム開発もデバッグにも役立ちそうです。

この記事が気に入ったらサポートをしてみませんか?