Luaスクリプトのおはなし(びぼーうろく)

みなさんこんにちはゲストCもちです。たまにはブログかいた方がいいだろうと思って、思いついたのがLuaスクリプトについてなんで書こうと思います。と言っても私は情報系の人間ではないですし、プログラミングなんてほとんど触ったことのない人間なんでどっちかというと備忘録... 間違ってたら指摘お願いします... 自分が分かっているところまでをまとめたメモなので...


1.TAS用の基本形を知ろう!
いっぱいtasvideosに載ってるけど、いちいち翻訳するの面倒だからここに書くよ。原文見たかったらそっち行ってね。

emu.frameadvance()
これはレジスターじゃないけど、これを活用することで書ける。()内がTrueの時に1f進めるみたいな処理なのかな?Desmumeはつかっちゃダメみたい。少しの間だけ使ったことあるけど、FrameAdvanceをしても一切描画されなくなっちゃうのでこれはdesyncの原因になる。一応こうやって使うみたい↓

- ここで宣言
while true do
-ここに処理を記述
emu.frameadvance()
end

gui.register(function)
これが一番オススメ 常に表示され続けるし超便利。ただしbotを作るのに使うのはダメみたい。こうやって使うみたい↓

local function Fn()
-ここにコードを記述
end
gui.register(Fn)

emu.registerbefore(function)
これは内部変数が変わる前に呼び出されるもの的な感じなのかな?普通に使うと、スロー再生の時に結構消えたりするから使いづらい。ラグフレームがほとんど出ないゲームなんかはキレイに表示されるかも?利点はbotを作るときに正確になることなのかな?tasvideosはオススメしていた。使い方はこうみたい↓

local function Fn()
-ここにコードを記述
end
emu.registerbefore(Fn)

emu.registerafter(function)
今度はafterって言ってるぐらいだし逆なのかな?使ったことはないです。tasvideosでは不整合が報告されてるって言ってるし使わない方がいいのかも?こう使うっぽい?↓

local function Fn()
-ここにコードを記述
end
emu.registerbefore(Fn)


2.導入の仕方を知ろう!
導入の仕方のフローチャートを載せます。この順番でやろうね!


①まずDesmumeでRAM Searchを行ってやりたいことのメモリ番地を特定しておこう!(これもいつか備忘録書くかも)
②メモ帳とかVisual Studio Codeとかでコードを書こう!
③出来たら名前を付けて保存→任意の名前(バグったら嫌だし英語でつけよう).Luaで保存する。
④Desmumeを開いて、ツール→Luaスクリプト→新しいLuaスクリプトウィンドウ...→参照→Luaファイルを選択して開く
⑤エラーが出たら②からやり直そう!上書き保存ですぐに反映してくれるよ。
⑥上手くいったらTwitterで自慢しよう。やったね。

3.書き方を知ろう!
じゃあ早速書いてみよう!今回はおかえりちびロボTASpart10で登場していたX軸とY軸をDesmumeの画面上に表示させるものを書いてみよう。事前の調査でX軸は(02234F34)に4bytesで、Y軸は(02234F38)に4bytesで格納されていることが分かっています。まずは完成形から見てみましょう。

local function Fn()
local X
local Y

X=memory.readdword(0x02234F34)
Y=memory.readdword(0x02234F34)
gui.text(0,0,"X: "..X)
gui.text(50,0,"Y: "..Y)

end
emu.registerbefore(Fn)

1で出てきた基本形からいっぱい増えましたね。一個ずつ見ましょう。まずはlocal Xとlocal Yです。localというのはたぶん、いまからローカル変数を作りまーす!みたいな宣言にあたるのだと思います。local+好きな名前が形となります。C言語で言うintとかstrとかああいうやつに当たるのだと思うんですけど、Cとかのほかの言語との違いは型の種類がたぶんなさそう?なところ。私みたいなプログラミング初心者は型とかクラスとかで手がいっぱいになりそうだけど、この言語はそれを気にしなくていいみたい。

次。X=memory.readdword(0x02234F34)とその次のやつ。これはさっき宣言した変数に値を代入してあげている処理をしているよ!数学的に考えてもいいんだけど、右から処理が行われるので逆にするとエラー吐くと思うから注意かな。memory.readdword()は()のアドレス番地のメモリ値を読んでねって処理。これには3つ種類があるから覚えよう!memory.readbyte(),memory.readword(),memory.readdword()ってのがある。前から1byte,2bytes,4bytesのメモリ値を読むときに使うよ。今回は4bytesで管理されてるので3番目を使ったって感じだね。
()の中は変数でもいいよ。私はまだそんな場面に遭遇してないから直接メモリ番地を入れているよ。メモリ番地の前についている”0x”っていうのは16進数を書いてますよっていう記述になる。これがないとエラー吐かれます(2敗)

次。gui.text(0,0,"X: "..X)とその次のやつ。これはエミュレーターに文字を書く関数です。構成は、gui.text(x,y,string,color1,color2)らしいよ。このコードでいうと、最初の0がX座標、次の0がY座標、"X: "がstring、".."がよくわかんない... その後のXは、ここに変数を書くと変数の値が書かれるよ。このコードじゃcolor1とcolor2は省略されてるみたい。もし文字の色を変えたかったら、変数の後に記述すると上手くいくよ。color1が中身の色で、color2が影の色だよ。ただ0x7FFFFFFFを超える色を指定してはダメみたい。 


こんな感じ!これでいつでもメモリ値が見れるね。あとは条件分岐等を使ってあげていろいろできます!これだけでも十分世界変わるから。




この記事へのコメント

2021年01月
               1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31