NSLua/NScripter拡張用ライブラリ「NSLa」

(公開日:2015/01/22)

(最新版:2023/03/07)

NSLa.zip

(旧版:2021/10/23)

NSLa20211023.zip

(文字描画の方式を大きく変更したため、変更前のバージョンも念のため残しておきます。)

現存最大規模のNScripter用ライブラリです。
荒れ放題のこのページと作りかけのマニュアルはそのうち整備します……

NScripterとNSLuaの境界線を意識しないようにするライブラリです。
NScripterの文法をおおよそ維持しつつ、
日本語ラベルやローカルラベル・ローカル変数に対応したり、Luaを混ぜて書けるようになったりします。
NScrスクリプトっぽいファイルにLuaコードを埋め込んだり、Luaコード内にNScrっぽいスクリプトを埋め込んだり出来ます。

【NScr目線】
 000.txt〜255.txt(初期値)に「『“NScrの変数を記述できる”Luaコード』を埋め込めるスクリプト」を記述できます。
 スクリプトはLuaの上に展開され、関数一つで動的に追加が可能です。

【Lua目線】
NSLua上に「『“NScrの変数を記述できる”Luaコード』を埋め込める、NScripterっぽいスクリプト」を記述可能になります(すごいNSExec関数)。
【最近の主な更新内容】
・テーブル定義時に生の全角文字をキーとして認識する

・あらかじめ予約しておいた番号を自動でエイリアスに割り振るローカル変数
 (その場で名前を付けられるローカル変数)

・&記法(Nスク命令への単独のLua変数埋め込み略記)で全角糖衣構文、テーブル、関数呼び出しに対応
・一括代入記法右辺で演算記号を使えなかった不具合の修正

・defsubを実装した(全角文字も登録可、if等内部で使う文字はブロック)

・Nスク変数がローカル化可能になった
・全てのラベルに(暗黙のローカル変数として)可変引数を渡せるようになった
・returnが戻り値を渡せるようになった
・F11でデバッグコンソールを出せるようになった
いまやラベルは関数そのものです!

・Nスク変数の一括代入記法
・システムカスタマイズ相当の処理を容易に行えるよう関数へ切り出し


・nsend/nsbreak(ns関数を離脱する内部命令)

・$0+="hoge"
 %0-=5
 %0++
 $0--
 等のオプション

・コロンのエスケープを「/:」→「::」に変更一本化(/:では問題が大きいことに気付きました)

・(非english時)テキスト中の奇数バイト半角文字を自動でエスケープしたり全角に直したりする
・(english時)特殊記号(!sd !d100 !w100 !s10 #ffffaa / @ \ @ ¥)と変数埋め込みが常に通るように変更
       全角文字を混ぜて書いた場合に自動でスペースを挿入し文字化けを避ける

・zenkakkoの復活
 埋め込みLuaの表記を拡張する一方で誤爆リスクを高める自動解釈オプション群( hoge.ほげ→hoge["ほげ"] 等)
 Nスク命令・テキスト内にLua変数を名前指定で埋め込む表記(^^a^^相当の記述&a {a})

・+= -= *= /= ..=を埋め込みLuaで使用するオプション(*= /=は不完全)、
 += -= *= /=  をNスクmov命令で使用するオプション(こちらは問題なし)
・00.txtを併用することでsavegame時のクラッシュ現象を封殺
・複数行コメントアウトに対応
・jumpfの飛び先に名前を付けられるように
・savepoint使用可能な箇所を暫定的に制定
・複数行Luaコード埋め込みの完全な入れ子(ns関数の入れ子)に対応
・独自forをpairs相当のテーブル回しに対応
・「^^^^」「/」「/../」「ifとforの評価式」中のNスク変数変換について、
 数字変数と剰余%0 と % 0が誤爆しないように改善
・「^^^^」が文字列を返すとき、命令内の埋め込み(テキスト以外)でも文字列を生でも返却可能に
・自前のファイルログ
・ラベル定義の重複時に上書きせず、エラーを吐くオプション
・ifの直後に限り、コロンだけでなくthenも書けるように。
・コメントアウトの仕様を整理(--でも;でも通るように)
・複数行埋め込みLua内に記述したns関数内でラベルを定義した際のバグ、
  および/. //..// ./や//. /../ .//と入れ子にした際の重大な解析エラーを修正
	/../同士や//..//同士の入れ子には現段階で対応していませんが、//..//と/../の組み合わせも色々バグっていました。
 ・全角「¥@」によるクリック待ちをスキップで飛ばせなかったミス
 ・細かいバグ修正(色々いじりすぎて具体的な箇所を忘れた)
 ・コールバック全般からNSNS関数への内容切り出し(コールバック自作の際の取り回し性向上のため:animation内でNSGetClickしている点は留意しておいてください。)
 ・NSLa側のシステムエラー時、最後に通過したラベルを可能な限り通知するように変更
 ・↑について、現在のブロック名および位置(そのブロックの何行目か)も表示するように。
	要するにNスク本体が普段教えてくれるアレです。
	ブロック名:ns関数に渡す名前 自動読み込みの範囲では連番の名前が付きます "102.txt" とか
  あくまでもNSLa側で処理するエラーに限ります。命令記述(NSExec)自体でコケた場合は関与できません。
new:拡張スクリプトの自動読み込みに関するオプション(柔軟に読み込めるように)
new:ラベルログの暗号化オプション
new:システム命令"outif"の追加(全てのifネストを離脱、初期バージョンにあった命令を名前変えて復活)
既読スキップとラベルログの実装、複数のバグ修正


--以下を000.txt〜255.txtに記述すると自動で読み込む--------------------
*define		;*defineは任意(あればNSLua側で定義ブロックとして実行)
numalias piyo,%0 :inc %0
return	;gameではない

*start		;*startも任意(あればNSLua側で実行ブロックとして実行)
mov $10,"NSLua 内にNScrのスクリプトを記述し、"
/NSExec('puttext "その中で逆にLua の命令も書けるようになるライブラリ"')
何が出来るかと言うと、	;←テキスト後セミコロンが注釈扱いになる独自仕様
たとえば	:mov $9,"テキスト後の命令" :これが通ります。@

たとえば日本語ラベルが使えます。@
goto *ソクラテス
jumpf
*ソクラテス
goto *表面張力

~
skip 3
*表面張力
ね?\


たとえばスクリプトにLuaコードを埋め込み可能です。@
;命令の先頭に"/"または//を記述すると、改行またはコロンまでをLuaのコードとして実行(loadstring)します。
/a="おうおう" b="あうおう" --Luaコードを1行埋め込んだり
行中で使ったり :/NSOkBox("ここから関数呼ぶこともできます","") :します。
/a=%0    --"/"の場合はNScr変数を記述可能です。変数の番号指定にはエイリアスも使えます。
//a="%0" --"//"は変換を行いません。


;複数行のLuaコードを埋め込むことも出来ます。
;"/."から"./"まで、または"//."から".//"までの区間が「複数行のLuaコード」として実行されます。
/.
function hoge()
local a=68.5
return a^2
end
./



;テキストやNスク命令の引数にLuaコード(値を1つ返す関数・式・変数)を用いることができます。
;NScr命令の引数に「^^」で囲まれたコードを埋め込んで使います。
mov $7,^^local a=string.sub("このように★",1,10) return a^^	
$7\

/a="テスト"
^^a^^ ;Luaコードの結果または戻り値1つをテキストとして表示したり、
テキスト中に混ぜる^^a^^ことができます。\



/.
ns([[
   	埋め込んだLua コード内にまたスクリプトを埋め込んだり
   	mov $10,"おおおお" 
]])
local b=$10
return $10
./

自在です。



また、ifとforに関しては独自の文法を持ちます。\
【if】
;評価式はLuaに準じますが、thenはなくても構いません。
;Nスクの変数とelse・elseifが使えます。
if $piyo==fuga()
  おおお
elseif(true)
  あああ
else
  いいい
    ;"if"から命令末尾までが評価式と見なされます。
    ;したがって、同じ行に続ける場合はコロンで区切ります。
  if(1):NSOkBox("","") :end
end
互換用のIFもあります(こちらはNスクと同じ(偽なら次の行へ移動という)動作です)

【for】
forの記述はLuaに近い方式(for i=1,10,2)ですが、末尾はnextで閉じます。
※イテレータ(pairs/ipairsのような)が使えないのでこちらは貧弱です。

なおdefineresetには対応していません。