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
*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自身に作らせることが可能なのだ。