NScripterにNScripterのソースを作らせる。

http://chappy.exblog.jp/5334111/

前に書いたNScripterの全角判定記事がNスクのえらい人に捕捉されてたことです。こっちが見てると思ったらいつの間にか見られてた!

この「Nスクのえらい人」はもしかしたら多分私のことを言っているんじゃないかと思うんだが、私はせいぜい「Nスクのエロい人」くらいだと思います。作品なんて作ったことねーよー。
とは言え、「おまえが長く深淵を覗くならば、深淵もまた等しくおまえを見返すのだ。」*1ニーチェも言っていることだし(このネタは以前もやったなあ)、こちらからウォッチし返すことに何の痛痒も感じない訳で。
そんな訳で今回のお題はこちら。
色指定 : 幻惑郷

NScripterでを使ってて難儀することの一つに、色指定のやりづらさがあると思う。一部の命令が「変数による色指定」に対応してないからだ。

この点全くその通りでありまして、私も色々と困ることが多くありました。
問題になるのは、挙げられているmonocroの他にbarとかprnumとかそれこそsetwindowもそうだったりしますね。
barについては以前もbarclear - 永字八法で一応の解決策を考えてみた。
今回それを思い出して、さらにbar命令そのものへの不満点を解決したのが、これ。
http://www.eiji8pou.pics/download/bar.zip
内容物は

  • 05.txt(define節以下game以上に置く)
  • 06.txt(define節以下game以上に置く)
  • 15.txt(直接実行されないところに置く)
  • 20.txt(直接実行されないところに置く)

となっている。
bar命令を徹底的に拡張してみた。その改修点は以下のとおり

バーの伸びる方向を選べるようにした。
通常の左から右だけではなく、右から左、下から上、上から下に伸びるようにできる。
バーのパラメータを一部分だけ変更できるようにした。
いちいち全てのパラメータを再指定しなくても、長さ・位置・大きさ・最大値・色・方向を別々に変更できる。
現在のパラメータを取得できるようにした。
逆に、現在の設定の数値を返すようにした。それを調べてから相対的な変更をすることが楽になった。
色が変数で指定できるようにした。
これが本来の目的だった。色を数値、あるいは特別に設定したnumaliasで変更できる。
隠れる機能をつけた。
一時的に隠すことができるようになった。隠されたバーは画面には出てこないが、内部的には生きており設定変更などを受け付ける。
バーを使っているかどうか確認できるようにした。
有用かどうかはさておき、そういう機能もあっていいだろうと言うことで。

サンプルスクリプト

bar_init 0 ; 0番のバーを使うことを宣言。
bar_setpos 0,20,20 ; 0番のバーの左上の位置を20,20に設定
bar_setsize 0,600,100 ; 0番のバーの最大領域を600*100に設定
bar_setturn 0,1 ; 0番のバーの伸びる方向を、「右から左」に設定
; 0=左から右(デフォルト)
; 1=右から左
; 2=下から上
; 3=上から下
bar_setmax 0,100 ; 0番のバーの最大値を100に設定
; バーの持つ値を最大値以上にすると、バーは設定した領域全体を塗りつぶす。

; ここまでの、bar_setxxx命令は、対になるbar_getxxx命令を持つ。

bar_setcolor_bynum 0,16,8,0 ; 0番のバーの色を数値で設定する。
; バー番号の次の数字は、それぞれRGBに対応する。0以上15以下の16段階。

; ここまでで準備完了

bar 0,20 ; 0番のバーの値を20にして、その他の設定とともに内部的に反映させる。
print 1 ; 画面に反映させるにはprint命令が必要。

; 色を変えてみる。
bar_setcolor_byword 0,aliceblue ; 0番のバーをaliceblue(#F0F8FF)に設定
; 使えるキーワードは後述。
bar_print 0 ; 色の変更を内部的に反映
print 1 ; 画面に反映させる。

bar_hide 0 ; 0番のバーを隠す。
print 1 ; 画面に反映させる。

bar_show 0 ; 0番のバーを表示する。
print 1 ; 画面に反映させる。

barclear 0 ; 0番のバー(だけ)を消す。
print 1 ; 画面に反映させる。

; bar_hide, bar_show, barclear は引数に-1を受け付ける。
; -1を指定した場合、それは全てのバーが対象になる。

使える色キーワード

キーワード コード
aliceblue F0F8FF
antiquewhite FAEBD7
aqua 00FFFF
aquamarine 7FFFD4
azure F0FFFF
beige F5F5DC
bisque FFE4C4
black 000000
blanchedalmond FFEBCD
blue 0000FF
blueviolet 8A2BE2
brown A52A2A
burlywood DEB887
cadetblue 5F9EA0
chartreuse 7FFF00
chocolate D2691E
coral FF7F50
cornflowerblue 6495ED
cornsilk FFF8DC
crimson DC143C
cyan 00FFFF
darkblue 00008B
darkcyan 008B8B
darkgoldenrod B8860B
darkgray A9A9A9
darkgreen 006400
darkkhaki BDB76B
darkmagenta 8B008B
darkolivegreen 556B2F
darkorange FF8C00
darkorchid 9932CC
darkred 8B0000
darksalmon E9967A
darkseagreen 8FBC8F
darkslateblue 483D8B
darkslategray 2F4F4F
darkturquoise 00CED1
darkviolet 9400D3
deeppink FF1493
deepskyblue 00BFFF
dimgray 696969
dodgerblue 1E90FF
firebrick B22222
floralwhite FFFAF0
forestgreen 228B22
fuchsia FF00FF
gainsboro DCDCDC
ghostwhite F8F8FF
gold FFD700
goldenrod DAA520
gray 808080
green 008000
greenyellow ADFF2F
honeydew F0FFF0
hotpink FF69B4
indianred CD5C5C
indigo 4B0082
ivory FFFFF0
khaki F0E68C
lavender E6E6FA
lavenderblush FFF0F5
lawngreen 7CFC00
lemonchiffon FFFACD
lightblue ADD8E6
lightcoral F08080
lightcyan E0FFFF
lightgoldenrodyellow FAFAD2
lightgreen 90EE90
lightgrey D3D3D3
lightpink FFB6C1
lightsalmon FFA07A
lightseagreen 20B2AA
lightskyblue 87CEFA
lightslategray 778899
lightsteelblue B0C4DE
lightyellow FFFFE0
lime 00FF00
limegreen 32CD32
linen FAF0E6
magenta FF00FF
maroon 800000
mediumaquamarine 66CDAA
mediumblue 0000CD
mediumorchid BA55D3
mediumpurple 9370DB
mediumseagreen 3CB371
mediumslateblue 7B68EE
mediumspringgreen 00FA9A
mediumturquoise 48D1CC
mediumvioletred C71585
midnightblue 191970
mintcream F5FFFA
mistyrose FFE4E1
moccasin FFE4B5
navajowhite FFDEAD
navy 000080
oldlace FDF5E6
olive 808000
olivedrab 6B8E23
orange FFA500
orangered FF4500
orchid DA70D6
palegoldenrod EEE8AA
palegreen 98FB98
paleturquoise AFEEEE
palevioletred DB7093
papayawhip FFEFD5
peachpuff FFDAB9
peru CD853F
pink FFC0CB
plum DDA0DD
powderblue B0E0E6
purple 800080
red FF0000
rosybrown BC8F8F
royalblue 4169E1
saddlebrown 8B4513
salmon FA8072
sandybrown F4A460
seagreen 2E8B57
seashell FFF5EE
sienna A0522D
silver C0C0C0
skyblue 87CEEB
slateblue 6A5ACD
slategray 708090
snow FFFAFA
springgreen 00FF7F
steelblue 4682B4
tan D2B48C
teal 008080
thistle D8BFD8
tomato FF6347
turquoise 40E0D0
violet EE82EE
wheat F5DEB3
white FFFFFF
whitesmoke F5F5F5
yellow FFFF00
yellowgreen 9ACD32

蛇足

実は、テストが完全に済んでないので、バグがあることが考えられます。
富豪的プログラミングばんざーい。

思い出した

エントリーのタイトルの理由を説明してなかったのを思い出した。
えーとつまり、このスクリプトは4000行・900kbを超える大型スクリプトだが、その大部分は(当然と言えば当然)マシンに自動生成させている。もっと言うならば、NScripterを使って作成したのである。

00.txt

NScripterスクリプトを生成するスクリプト

*define
game
*start
saveoff
mov %0,1000
csvopen "color.txt","r"
~
csvread $%0
inc %0
csveof %1
if %1=0 jumpb
csvclose
csvopen "bar_defsub.txt","w"
csvwrite " *bar_print_main"
csvwrite "skip ?bar_param[%bar_num][bar_color]"
for %0=0 to 15
	if %0<10 itoa $0,%0
	if %0=10 mov $0,"A"
	if %0=11 mov $0,"B"
	if %0=12 mov $0,"C"
	if %0=13 mov $0,"D"
	if %0=14 mov $0,"E"
	if %0=15 mov $0,"F"
	for %1=0 to 15
		if %1<10 itoa $1,%1
		if %1=10 mov $1,"A"
		if %1=11 mov $1,"B"
		if %1=12 mov $1,"C"
		if %1=13 mov $1,"D"
		if %1=14 mov $1,"E"
		if %1=15 mov $1,"F"
		for %2=0 to 15
			if %2<10 itoa $2,%2
			if %2=10 mov $2,"A"
			if %2=11 mov $2,"B"
			if %2=12 mov $2,"C"
			if %2=13 mov $2,"D"
			if %2=14 mov $2,"E"
			if %2=15 mov $2,"F"
			mov $10,"_bar %bar_num,?bar_param[%bar_num][bar_value2],?bar_param[%bar_num][bar_x2],?bar_param[%bar_num][bar_y2],?bar_param[%bar_num][bar_width2],?bar_param[%bar_num][bar_height2],?bar_param[%bar_num][bar_max2],#"+$0+$0+$1+$1+$2+$2+":return"
			csvwrite $10
		next
	next
next

mov %0,1000
~
if $%0="" jumpf
split $%0,"/",$1,$2
mov $10,"_bar %bar_num,?bar_param[%bar_num][bar_value2],?bar_param[%bar_num][bar_x2],?bar_param[%bar_num][bar_y2],?bar_param[%bar_num][bar_width2],?bar_param[%bar_num][bar_height2],?bar_param[%bar_num][bar_max2],#"+$2+":return"
csvwrite $10
inc %0
jumpb
~
csvclose
csvopen "bar_define.txt","w"
mov %0,1000
mov %1,4097
~
if $%0="" jumpf
split $%00,"/",$1,$2
mov $10,"numalias "+$1
csvwrite $10,%1
inc %0
inc %1
jumpb
~
csvwrite "numalias colorname_end",%1
csvclose
end

color.txt

aliceblue/F0F8FF
antiquewhite/FAEBD7
aqua/00FFFF
aquamarine/7FFFD4
azure/F0FFFF
beige/F5F5DC
bisque/FFE4C4
black/000000
blanchedalmond/FFEBCD
blue/0000FF
blueviolet/8A2BE2
brown/A52A2A
burlywood/DEB887
cadetblue/5F9EA0
chartreuse/7FFF00
chocolate/D2691E
coral/FF7F50
cornflowerblue/6495ED
cornsilk/FFF8DC
crimson/DC143C
cyan/00FFFF
darkblue/00008B
darkcyan/008B8B
darkgoldenrod/B8860B
darkgray/A9A9A9
darkgreen/006400
darkkhaki/BDB76B
darkmagenta/8B008B
darkolivegreen/556B2F
darkorange/FF8C00
darkorchid/9932CC
darkred/8B0000
darksalmon/E9967A
darkseagreen/8FBC8F
darkslateblue/483D8B
darkslategray/2F4F4F
darkturquoise/00CED1
darkviolet/9400D3
deeppink/FF1493
deepskyblue/00BFFF
dimgray/696969
dodgerblue/1E90FF
firebrick/B22222
floralwhite/FFFAF0
forestgreen/228B22
fuchsia/FF00FF
gainsboro/DCDCDC
ghostwhite/F8F8FF
gold/FFD700
goldenrod/DAA520
gray/808080
green/008000
greenyellow/ADFF2F
honeydew/F0FFF0
hotpink/FF69B4
indianred/CD5C5C
indigo/4B0082
ivory/FFFFF0
khaki/F0E68C
lavender/E6E6FA
lavenderblush/FFF0F5
lawngreen/7CFC00
lemonchiffon/FFFACD
lightblue/ADD8E6
lightcoral/F08080
lightcyan/E0FFFF
lightgoldenrodyellow/FAFAD2
lightgreen/90EE90
lightgrey/D3D3D3
lightpink/FFB6C1
lightsalmon/FFA07A
lightseagreen/20B2AA
lightskyblue/87CEFA
lightslategray/778899
lightsteelblue/B0C4DE
lightyellow/FFFFE0
lime/00FF00
limegreen/32CD32
linen/FAF0E6
magenta/FF00FF
maroon/800000
mediumaquamarine/66CDAA
mediumblue/0000CD
mediumorchid/BA55D3
mediumpurple/9370DB
mediumseagreen/3CB371
mediumslateblue/7B68EE
mediumspringgreen/00FA9A
mediumturquoise/48D1CC
mediumvioletred/C71585
midnightblue/191970
mintcream/F5FFFA
mistyrose/FFE4E1
moccasin/FFE4B5
navajowhite/FFDEAD
navy/000080
oldlace/FDF5E6
olive/808000
olivedrab/6B8E23
orange/FFA500
orangered/FF4500
orchid/DA70D6
palegoldenrod/EEE8AA
palegreen/98FB98
paleturquoise/AFEEEE
palevioletred/DB7093
papayawhip/FFEFD5
peachpuff/FFDAB9
peru/CD853F
pink/FFC0CB
plum/DDA0DD
powderblue/B0E0E6
purple/800080
red/FF0000
rosybrown/BC8F8F
royalblue/4169E1
saddlebrown/8B4513
salmon/FA8072
sandybrown/F4A460
seagreen/2E8B57
seashell/FFF5EE
sienna/A0522D
silver/C0C0C0
skyblue/87CEEB
slateblue/6A5ACD
slategray/708090
snow/FFFAFA
springgreen/00FF7F
steelblue/4682B4
tan/D2B48C
teal/008080
thistle/D8BFD8
tomato/FF6347
turquoise/40E0D0
violet/EE82EE
wheat/F5DEB3
white/FFFFFF
whitesmoke/F5F5F5
yellow/FFFF00
yellowgreen/9ACD32

やりかた。

00.txtとcolor.txtをnscr.exeと同じフォルダに置いてnscr.exeを実行すると、bar_defsub.txtとbar_define.txtが作成される。
bar_defsub.txtが20.txtと同じものであり、bar_define.txtが06.txtと同じものになる。
プログラムの部分は人間が作らなければならないが、繰り返しの多い部分は、NScripter自身に作らせることが可能なのだ。

ギミック

csv系の命令は、いささか制限はあるものの、NScripter自身にファイルを生成する能力を与えてくれる素晴らしい命令です。なんと言ってもcsvと銘打っておきながらどんなファイル名でも構わないからです。
楽をするために是非使いこなせるようにしましょー。

*1:全文は「怪物と闘う者は、その過程で自らが怪物と化さぬよう心せよ。おまえが長く深淵を覗くならば、深淵もまた等しくおまえを見返すのだ。」善悪の彼岸146節