おおむねVisual BasicやQuick Basic系を参考にしています。ラベルの仕様等はプチコンのBASICも参考にしています。BASICは大文字と小文字を区別しませんが、文字列の中身は区別されます。また、テーブル記法の際にも大文字小文字は区別されます。
BASICはまず最初に@startラベルへジャンプし、そこから順番に実行されます。
; コメント文です。
;原則一行一命令ですが、
a=1
b=1
;このように書くことも出来ます。
a=1:b=1
@start ;このラベルから実行が始まります。
@label
@label2
;ダメな例
@2_ban ; 無効なラベル名
@あいうえお ; 日本語も使えません。
@label ;上で同じラベルが定義されているため二重定義はエラーになります。
;次のふたつはどちらも表示文になります。
これはペンです。
> This is a pen.
;特殊表示文字の例です。
ここで改行\nされます。
ルビの例です。{天翔龍閃/あまかけるりゅうのひらめき}。
[タグ]タグのある表示文の例です。
;全部同じ意味になります。
goto @game_over
goto "@game_over"
next_label="@game_over"
goto next_label
gosub @sub ;サブルーチンジャンプする
.
.
.
@sub
;なんらかの処理
return ;呼び出し元の次の命令へ戻る
; 一行IF文の例です。
if a==1 then b=0:goto @a_eq_1 else c=0
;複数行IF文の例です。
if a==1 then
b=0
goto @a_eq_1
else
c=0
end if
for i=1 to 10
cprint i
next
for i=10 to 1 step -1
cprint i
next
for i=1 to 1000
if i==10 then exit
next
for i=1 to 10
cprint i
if i<5 then continue
cprint "i>=5"
next
i=0
do while i<5
cprint i
i=i+1
loop
do
cprint i
i=i-1
loop while i>0
do
cprint "!"
loop
;これは無限ループします。
for i=1 to 100
cprint i
if i==5 then exit
next
;5まででループが終わります。
for i=1 to 10
if i<5 then continue
cprint i
next
;5より小さいときはcontinueでループ頭に戻るため、値が表示されません。
(変数の例)
hitpoint=1 ; グローバル変数
name="太郎" ; グローバル変数
_screenmode=1 ; システム変数
%i=1 ;ローカル変数
gosub @sub
cprint %i
system "pause"
quit
@sub
%i=2 ; この%iは上の%iとは別の変数になります。
cprint %i
return
;シンボルの例
#c #up #down #r #wd #wu
;これらは大文字でも同じ意味になります。大文字に変換した文字列と等価です。つまり、次の三つは等しくなります。
#c #C "#C"
内部的にはシンボルなのですが、NScripter2における色指定の頭文字には#を使います。
;色指定の例
#FF88BBCC ; alpha=FF R=88 G=BB B=CC
#5588ff ; alpha=FF R=55 G=88 B=FF
一部の命令(spなど)は、パラメータに「テーブル記法」を要求します。
;実際に使われてる例です。{}で囲まれている部分がテーブル記法です。
sp "window:windowframe",{name="win\wind_frame.png",x=101,y=541,z=15}
sp "window:save",{name={"win\wb_save_off.png","win\wb_save_on.png"},x=810,y=575,z=0}
array[0]=100
array[1]=10
array[2]=2000
array2d[0][0]=1
array2d[0][1]=2
array2d[1][0]=3
array2d[1][1]=4
また、変数名.メンバ名と書くことで構造体(レコード型)を扱えます。こちらも宣言は必要ありません。
info.x=100
info.y=50
info.c=#FFFFFFFF
■算術演算子
a+b (数値同士なら足し算、文字列同士なら連結です)
a-b
a*b (数値同士ならかけ算、文字列*数値の場合は反復文字列です)
a/b (NScripter2の割り算は小数の割り算です。整数解が必要ならfloor(a/b)のようにfloor関数を使って下さい)
a mod b (aをbで割ったあまりです。こちらは整数の、あまりの出る割り算です)
a^b (aのb乗です。どちらも小数を指定できます。)
■比較・論理演算子
a>b
a<b
a>=b
a<=b
a==b
a<>b
not a
a and b
a or b
resettimer ;これは命令
i=gettimer() ;このgettimer()は関数。resettimerからの経過時間をms単位で返す
実装の形態によって命令は3種類、関数は2種類に分けられます。
;defsubの例です。
defsub ev,"S"
.
.
.
@ev
param %filename
sp "bg",{name=%filename,x=0,y=0,z=1000}
print #f,500
return
sp "fillred",{name="*#FFFF0000",x=0,y=0,z=1000};画面と同サイズの赤の塗りつぶし長方形
sp "whitebox",{name="*400,400,#FFFFFFFF",x=100,y=100,z=10} ; 400x400、真っ白の長方形
sp "movie_tex1",{name=":movie(test.nmv)",x=0,y=0,z=1} ; ムービーテクスチャ、ループも透過もなし
sp "movie_tex2",{name=":movieloopalpha(test.nmv,20)",x=0,y=0,z=1} ; ムービーテクスチャ、透過、ループ、ボリューム20
sp "textsp",{name="?TextSp,textfont",x=200,y=200,z=0} ; 文字列スプライト
;これより前にtextfontがfont命令で定義されているものとする
select "選択肢テキスト1",@label1,"選択肢テキスト2",@label2,"選択肢テキスト3",@label3
skip 1 ; スキップモード
skip 0 ; 通常モード
skip 2 ; オートモード
trap @skip_demo
.
.
.
.
@skip_demo
trap #nil ; これがないと、クリックで飛ばさなかったときにトラップモードが解除されない。
trap @l_skip,"L" ; Lボタンをクリックしたときのみジャンプします。
defsub bg,"S";bg命令を定義
defsub ld,"NS";ld命令を定義
goto @game_start
@bg
param %name
sp "bg",{name=%name,x=0,y=0,z=1000}
print #f,500
return
@ld
param %pos,%name ; pos=-1で左、pos=0で真ん中、pos=1で右、を想定。
%spname="chr"+STR(%pos)
sp %spname,{name=%name,x=1024,y=768,z=1}
getspinfo %spname,%info
%x=512+256*%pos-%info.w/2
%y=768-%info.h
spmove %spname,%x,%y
print #f,250
return
defsub test,"R"
.
.
test v
@test
param %s
vset %s,"text" ; 呼び出し元が指定した変数vにtextを代入します。
return
;なお、ここではグローバル変数を渡していますが、どんな変数でも渡せます。
call @lb,"SN","test",4
.
.
.
@lb
param %s,%n
for %i=0 to %n
cprint %s
next
return
str="beep"
exec str ; beep命令が実行されます。
getlogtext 12,%tag,%text ; 12個前の表示文のタグと本文テキストをそれぞれ取得する。
if getskip()==1 then return ; スキップモード時はリターン
if logchk(%n)==0 then ~ ;バックログを処理したいときにこんな感じで。
value=getconfig("chr_name")
defsub test,"R"
.
.
v=125
test v
@test
param %s
cprint vget(%s) ; 125が戻ります。
return
shell "notepad.exe"
shell "http://www.google.co.jp"
getclick %lu ; 必要の無い情報は省略できます。
getclick %lu,%ru
getmouse %x,%y
okbox "ウィンドウの文章がここにはいります。","ウィンドウタイトルです。"
yesnobox %result,"ウィンドウの文章がここにはいります。","ウィンドウタイトルです。"
;%resultには、はいならば1、いいえならば0が入っています。
input %result,"ウィンドウの文章がここにはいります。","ウィンドウタイトルです。"
resettimer ;ここで内部タイマをリセットする
.
.
.
waittimer 1000 ; ここで1秒になるまで待つ。
time %year,%day,%hour,%min,%sec
getpad 0,%lx,%ly,%rx,%ry,%dx,%dy,%a,%b,%x,%y,%start,%back,%l1,%r1,%l2,%r2,%l3,%r3
if %lx<>#nodata then
;データ入力があったのでパッド処理
end
if getscreen()==1 then ~;何かフルスクリーンモード用の処理
if getkey("CTRL")==1 then ~;CTRLが押されているときの処理
resettimer
.
.
.
.
if gettimer()<1000 then ~;1秒経ってない時にはなんらかの処理
system "dir" ; ディレクトリの内容を表示します。
system "dir > out.txt" ; リダイレクトも出来ます。
;全部デフォルト
font "text1",{}
;普通のフォント
font "text2",{name="MS ゴシック",color=#FFFFFFFF,width=16,height=16}
;袋文字
font "text3",{name="MS ゴシック",style="outline",outlinecolor=#FF000000,color=#FFFFFFFF,width=24,height=24}
;影付き文字
font "text4",{name="MS ゴシック",style="shadow",color=#FFFFFFFF,shadowcolor=#FF000000,width=24,height=24}
;袋文字+字グラデーション
font "text5",{name="MS ゴシック",style="fancy",outlinecolor=#FF000000,color1=#FFFFEEAA,color2=#FFFFFFFF,shadowcolor=#FF000000,fx=1,fy=1,width=24,height=24}
;テーブル指定で指定されない値にはデフォルト値があります。
sp "sp1",{name="test.png",x=100,y=100,z=100,a=128}
sp "set:sp2",{name={"cell1.png","cell2.png"},x=200,y=200,z=100,cell=0,blend=1}
;blendは0または省略で通常、1で加算ブレンド
sp "set:sp2",{name={"cell1.png","cell2.png"},cx=300,cy=300,xs=1.2,ys=1.2,rot=45,z=100,cell=0}
;角度はディグリー(度)単位です。ラジアンではありません。
sp "set:sp3",{name={"cell1.png","cell2.png","cell3.png"},x=200,y=200,z=100,animtime=100,animtype="normal"}
sp "set:sp4",{name="test.png",x=100,y=100,z=100,a=128,effect="nega"};ネガポジ反転
sp "set:sp5",{name="test.png",x=100,y=100,z=100,a=128,effect="monotone",color=#FF3388FF};モノトーン
sp "set:sp6",{name=":movieloopalpha(test.nmv)",x=0,y=0,z=0} ; ムービーテクスチャ
sp "set:sp7",{name=":moviealpha(bomber.nmv)",x=100,y=200,z=0,delete=1} ;ムービーテクスチャ、再生が終わったら削除
spformat "sp1",0,"あいうえおかきくけこ{漢字/ルビ}さしすせそ",{font="text",x=2,y=2,w=25,h=4},{font="ruby"}
;ここで、本文のx,yはピクセル単位でスプライトの左上からの座標、wとhは文字数単位で幅と高さです。
spputtext "sp1",0,"あいうえおかきくけこ{漢字/ルビ}さしすせそ",{font="text",x=2,y=2,w=25,h=4,wait=50},{font="ruby"}
;x,yは文字を書き始める際の左上の座標、省略すると0,0。w,hは横と縦の文字数。waitは文字表示速度。
;本文テーブルのfontは本文の、ルビテーブルのfontはルビのフォント。
;ルビテーブルでpxやpyを指定すると、ルビの送り幅が指定できる(省略するとフォントの幅になる)
btn "window:sp1"
btn "window:sp2",{style="push"}
btn "window:sp3",{style="toggle"}
btn "window:sp4",{on="P(sp1,0)P(sp2,1)"}
btn "window:bar0",{style="bar"}
;ここより前にwindow:btn1とwindow:btn2はロードされているものとする。
btnclear "window"
btn "window:btn1"
btn "window:btn2"
@btnloop
btnexec %ret,"window"
if %ret==#r then ;右クリック時の処理
if %ret=="btn1" then ;ボタン1の時の処理
if %ret=="btn2" then ;ボタン2の時の処理
goto @btnloop
btnstr "S(se/test.ogg)P(set:sp1,1)"
print #c
print #rd,500
print #sl,500
print #f,500
print #u,500,"rule.png"
(system.luaで実装)
split "test/abc/def","/",a,b,c ; a="test" b="abc" c="def"
split "abc,def",",",a,b,c ; a="abc" b="def" c=""
splita "test/abc/def","/",a ; a[0]="test" a[1]="abc" a[2]="def" a[3]=#NIL
a[0]=1
a[1]=2
a[2]=3
vcopy b,a ; b[0]=1 b[1]=2 b[2]=3
fighter.hp=100
fighter.mp=0
vcopy monk,fighter ; monk.hp=100 monk.mp=0
s=strf("%3d",12) ; s=" 12"
s=strf("%04d",15) ; s="0015"
cprint join("/","abc","def","ghi") ; "abc/def/ghi"が出力される
a[0]="abc"
a[1]="def"
a[2]="ghi"
cprint joina("/",a) ; "abc/def/ghi"が出力される
cprint floor(3.14) ; -> 3
cprint floor(-1.5) ; -> -2 ; 小さい方に丸めています。
cprint ceil(3.14) ; -> 4
cprint ceil(-1.5) ; -> -1 ; 大きい方に丸めています。