オリスク支援補足TIPS
オリスク支援 - 永字八法について。
ある質問を受けたので、回答してみた。
http://d.hatena.ne.jp/eiji8pou/20050914/1126709682のスクリプトを使ってることが前提です。
bmp\haikei\mori\mo1.jpgは、目明し編と罪滅し編では違う画像になっています。そのどちらも使うために、下記のようなスクリプトを組みました。(前略) chnsa 5 bg "bmp\haikei\mori\mo1.jpg",1 \ chnsa 6 bg "bmp\haikei\mori\mo1.jpg",1 \ (後略)しかし、思ったように表示してくれません。どうしたらいいでしょうか?
これは、NScripterの仕様に基づく現象だと思われます。
同じ命令で同じ画像ファイル名を指定すると、前回のファイル名と比較して一致した場合はファイルの読み込みをしないようなのです。
今回はbg命令でそれが確認できましたが、他の命令でどうなるかはまだ確認していません。
ただ、この仕様の回避方法はあります。一度、別の背景画像に差し替えればいいのです。
その際は画面に反映させなければユーザーの目にその処理が触れることはありませんので、安心です。
下記のようにしてみてはいかがでしょうか?
(前略) chnsa 5 bg "bmp\haikei\mori\mo1.jpg",1 \ chnsa 6 bg black,0 ; ←この行を追加。一旦背景を内部的に真っ黒にしてみる。 bg "bmp\haikei\mori\mo1.jpg",1 \ (後略)
math.dll
この年になってC言語をやり始めるとは思わなかったよ。なんて言ったりして。
何かを学び始めるのに遅すぎるってことはないよな。
某氏からたきつけられて、C言語を使ってNScripter用のdllを作成してみた。
とりあえず、math.hに入っているような関数をそのままNScripterから使えるようにしてみたものです。また、それを使うためのNScripter側の準備もしてみました。
define_math.txt
numalias math_param1 numalias math_param2 numalias math_result numalias math_temp1 numalias math_temp2 numalias math_loop ------ ------ ;============================== ; アークタンジェント2 ; 引数は、%角度を受け取る変数,%距離を受け取る変数,%X座標,%Y座標 ;============================== *atan2 getparam i%math_result,i%math_loop,%math_param1,%math_param2 mov $math_temp1,"math.dll/510&" itoa $math_param1,%math_param1 itoa $math_param2,%math_param2 add $math_temp1,$math_param1 add $math_temp1,"&" add $math_temp1,$math_param2 exec_dll $math_temp1 getret %%math_result getret $math_temp2 atoi %%math_loop,$math_temp2 return ;============================== ; 平方根 ; 引数は、%結果を受け取る変数,%平方根を出したい変数 ; マイナスの数値を与えた場合、何もしない。 ;============================== *sqrt getparam i%math_result,%math_param1 if %math_param1<0 return if %math_param1=0 mov %%math_result,0:return mov $math_temp1,"math.dll/512&" itoa $math_param1,%math_param1 add $math_temp1,$math_param1 exec_dll $math_temp1 getret %%math_result return ;============================== ; 平方根2 ; 結果は1000倍された値になる。それ以外は何も変わらない。 ;============================== *sqrt2 getparam i%math_result,%math_param1 if %math_param1<0 return if %math_param1=0 mov %%math_result,0:return mov $math_temp1,"math.dll/513&" itoa $math_param1,%math_param1 add $math_temp1,$math_param1 exec_dll $math_temp1 getret %%math_result return ;============================== ; hypot - ユークリッド距離関数 ; 引数は、%結果を受け取る変数,%X座標,%Y座標 ; 原点と引数に与えた座標間の距離を返す。 ;============================== *hypot getparam i%math_result,%math_param1,%math_param2 mov $math_temp1,"math.dll/514&" itoa $math_param1,%math_param1 itoa $math_param2,%math_param2 add $math_temp1,$math_param1 add $math_temp1,"&" add $math_temp1,$math_param2 exec_dll $math_temp1 getret %%math_result return ;============================== ; hypot2 - ユークリッド距離関数2 ; 1000倍された距離を返す。それ以外はhypotと同じ。 ;============================== *hypot2 getparam i%math_result,%math_param1,%math_param2 mov $math_temp1,"math.dll/515&" itoa $math_param1,%math_param1 itoa $math_param2,%math_param2 add $math_temp1,$math_param1 add $math_temp1,"&" add $math_temp1,$math_param2 exec_dll $math_temp1 getret %%math_result return ;============================== ; 絶対値。引数をそのまま絶対値に変換する。 ;============================== *abs getparam i%math_result if %%math_result < 0 mul %%math_result,(-1) return ;============================== ; 絶対値。第一引数に第二引数の絶対値を代入する。 ;============================== *abs2 getparam i%math_result,%math_param1 if %math_param1 < 0 mul %math_param1,(-1) mov %%math_result,%math_param1 return ;============================== ; 端数切り上げ割り算 ;============================== *div2 getparam i%math_result,%math_param1 if %math_param1=0 inc %math_param1 mov %math_temp1,%%math_result mod %math_param1 div %%math_result,%math_param1 notif %math_temp1=0 inc %%math_result return
dll本体のダウンロード
ノート
某氏から「string.hが混じってる……」と指摘を受けたので、文字列関係の命令は別に切り出すことにした。
文字列系汎用ライブラリ
math.dll - 永字八法によって、汎用ライブラリ・define_math.txt - 永字八法から分離させられた部分。
スクリプト
------ ------ ;============================== ; 文字列の左側に追加をする。 ;============================== *left_add getparam s%math_result,$math_param1 add $math_param1,$%math_result mov $%math_result,$math_param1 return ;============================== ; 文字列を二つに分割する。右からn文字目で切り取る。 ;============================== *right_split getparam s%math_result,s%math_temp1,$math_param1,%math_param2 len %math_param1,$math_param1 sub %math_param1,%math_param2 mid $%math_result,$math_param1,0,%math_param1 mid $%math_temp1,$math_param1,%math_param1,%math_param2 return ;============================== ; 文字列を二つに分割する。右からn文字目で切り取る。2バイト文字用 ;============================== *right_split2 getparam s%math_result,s%math_temp1,$math_param1,%math_param2 len %math_param1,$math_param1 sub %math_param1,%math_param2*2 mid $%math_result,$math_param1,0,%math_param1 mid $%math_temp1,$math_param1,%math_param1,%math_param2*2 return
他に何か文字列関係で必要なものがあったっけ?
ベンチマーク実験
atan2が、スクリプト版とdll版の両方が出来たので、どちらが早いかをベンチマーク!
内容
xとyをそれぞれ-50から50の間で変化させて、10201の座標を作り、それぞれに対して二種類のatan2を実行し、その実行時間を調べる。
条件として、スクリプト版とdll版の順番を入れ替え、なおかつsaveoffするしないの都合4回を行うことにした。
結果
10201回の試行に対し、dll版は45秒前後で安定し、スクリプト版は50秒オーバーで安定した。これは条件をどのように入れ替えてもほぼ同じ結果になった。
つまり、dllを呼び出すオーバーヘッドを払ってもまだ速度的にはおつりが来ると言うことだ。
あーあ、これからは素直にdll使った方がマシってことか。
キャッスルやりてえなあ
でも、ソフトは売っちゃったんだよなあ……。
オリスク支援補足TIPS
オリスク支援 - 永字八法について。
ある質問を受けたので、回答してみた。
http://d.hatena.ne.jp/eiji8pou/20050914/1126709682のスクリプトを使ってることが前提です。
bmp\haikei\mori\mo1.jpgは、目明し編と罪滅し編では違う画像になっています。そのどちらも使うために、下記のようなスクリプトを組みました。(前略) chnsa 5 bg "bmp\haikei\mori\mo1.jpg",1 \ chnsa 6 bg "bmp\haikei\mori\mo1.jpg",1 \ (後略)しかし、思ったように表示してくれません。どうしたらいいでしょうか?
これは、NScripterの仕様に基づく現象だと思われます。
同じ命令で同じ画像ファイル名を指定すると、前回のファイル名と比較して一致した場合はファイルの読み込みをしないようなのです。
今回はbg命令でそれが確認できましたが、他の命令でどうなるかはまだ確認していません。
ただ、この仕様の回避方法はあります。一度、別の背景画像に差し替えればいいのです。
その際は画面に反映させなければユーザーの目にその処理が触れることはありませんので、安心です。
下記のようにしてみてはいかがでしょうか?
(前略) chnsa 5 bg "bmp\haikei\mori\mo1.jpg",1 \ chnsa 6 bg black,0 ; ←この行を追加。一旦背景を内部的に真っ黒にしてみる。 bg "bmp\haikei\mori\mo1.jpg",1 \ (後略)
math.dll
この年になってC言語をやり始めるとは思わなかったよ。なんて言ったりして。
何かを学び始めるのに遅すぎるってことはないよな。
某氏からたきつけられて、C言語を使ってNScripter用のdllを作成してみた。
とりあえず、math.hに入っているような関数をそのままNScripterから使えるようにしてみたものです。また、それを使うためのNScripter側の準備もしてみました。
define_math.txt
numalias math_param1 numalias math_param2 numalias math_result numalias math_temp1 numalias math_temp2 numalias math_loop ------ ------ ;============================== ; アークタンジェント2 ; 引数は、%角度を受け取る変数,%距離を受け取る変数,%X座標,%Y座標 ;============================== *atan2 getparam i%math_result,i%math_loop,%math_param1,%math_param2 mov $math_temp1,"math.dll/510&" itoa $math_param1,%math_param1 itoa $math_param2,%math_param2 add $math_temp1,$math_param1 add $math_temp1,"&" add $math_temp1,$math_param2 exec_dll $math_temp1 getret %%math_result getret $math_temp2 atoi %%math_loop,$math_temp2 return ;============================== ; 平方根 ; 引数は、%結果を受け取る変数,%平方根を出したい変数 ; マイナスの数値を与えた場合、何もしない。 ;============================== *sqrt getparam i%math_result,%math_param1 if %math_param1<0 return if %math_param1=0 mov %%math_result,0:return mov $math_temp1,"math.dll/512&" itoa $math_param1,%math_param1 add $math_temp1,$math_param1 exec_dll $math_temp1 getret %%math_result return ;============================== ; 平方根2 ; 結果は1000倍された値になる。それ以外は何も変わらない。 ;============================== *sqrt2 getparam i%math_result,%math_param1 if %math_param1<0 return if %math_param1=0 mov %%math_result,0:return mov $math_temp1,"math.dll/513&" itoa $math_param1,%math_param1 add $math_temp1,$math_param1 exec_dll $math_temp1 getret %%math_result return ;============================== ; hypot - ユークリッド距離関数 ; 引数は、%結果を受け取る変数,%X座標,%Y座標 ; 原点と引数に与えた座標間の距離を返す。 ;============================== *hypot getparam i%math_result,%math_param1,%math_param2 mov $math_temp1,"math.dll/514&" itoa $math_param1,%math_param1 itoa $math_param2,%math_param2 add $math_temp1,$math_param1 add $math_temp1,"&" add $math_temp1,$math_param2 exec_dll $math_temp1 getret %%math_result return ;============================== ; hypot2 - ユークリッド距離関数2 ; 1000倍された距離を返す。それ以外はhypotと同じ。 ;============================== *hypot2 getparam i%math_result,%math_param1,%math_param2 mov $math_temp1,"math.dll/515&" itoa $math_param1,%math_param1 itoa $math_param2,%math_param2 add $math_temp1,$math_param1 add $math_temp1,"&" add $math_temp1,$math_param2 exec_dll $math_temp1 getret %%math_result return ;============================== ; 絶対値。引数をそのまま絶対値に変換する。 ;============================== *abs getparam i%math_result if %%math_result < 0 mul %%math_result,(-1) return ;============================== ; 絶対値。第一引数に第二引数の絶対値を代入する。 ;============================== *abs2 getparam i%math_result,%math_param1 if %math_param1 < 0 mul %math_param1,(-1) mov %%math_result,%math_param1 return ;============================== ; 端数切り上げ割り算 ;============================== *div2 getparam i%math_result,%math_param1 if %math_param1=0 inc %math_param1 mov %math_temp1,%%math_result mod %math_param1 div %%math_result,%math_param1 notif %math_temp1=0 inc %%math_result return
dll本体のダウンロード
ノート
某氏から「string.hが混じってる……」と指摘を受けたので、文字列関係の命令は別に切り出すことにした。
文字列系汎用ライブラリ
math.dll - 永字八法によって、汎用ライブラリ・define_math.txt - 永字八法から分離させられた部分。
スクリプト
------ ------ ;============================== ; 文字列の左側に追加をする。 ;============================== *left_add getparam s%math_result,$math_param1 add $math_param1,$%math_result mov $%math_result,$math_param1 return ;============================== ; 文字列を二つに分割する。右からn文字目で切り取る。 ;============================== *right_split getparam s%math_result,s%math_temp1,$math_param1,%math_param2 len %math_param1,$math_param1 sub %math_param1,%math_param2 mid $%math_result,$math_param1,0,%math_param1 mid $%math_temp1,$math_param1,%math_param1,%math_param2 return ;============================== ; 文字列を二つに分割する。右からn文字目で切り取る。2バイト文字用 ;============================== *right_split2 getparam s%math_result,s%math_temp1,$math_param1,%math_param2 len %math_param1,$math_param1 sub %math_param1,%math_param2*2 mid $%math_result,$math_param1,0,%math_param1 mid $%math_temp1,$math_param1,%math_param1,%math_param2*2 return
他に何か文字列関係で必要なものがあったっけ?
ベンチマーク実験
atan2が、スクリプト版とdll版の両方が出来たので、どちらが早いかをベンチマーク!
内容
xとyをそれぞれ-50から50の間で変化させて、10201の座標を作り、それぞれに対して二種類のatan2を実行し、その実行時間を調べる。
条件として、スクリプト版とdll版の順番を入れ替え、なおかつsaveoffするしないの都合4回を行うことにした。
結果
10201回の試行に対し、dll版は45秒前後で安定し、スクリプト版は50秒オーバーで安定した。これは条件をどのように入れ替えてもほぼ同じ結果になった。
つまり、dllを呼び出すオーバーヘッドを払ってもまだ速度的にはおつりが来ると言うことだ。
あーあ、これからは素直にdll使った方がマシってことか。
キャッスルやりてえなあ
でも、ソフトは売っちゃったんだよなあ……。
オリスク支援補足TIPS
オリスク支援 - 永字八法について。
ある質問を受けたので、回答してみた。
http://d.hatena.ne.jp/eiji8pou/20050914/1126709682のスクリプトを使ってることが前提です。
bmp\haikei\mori\mo1.jpgは、目明し編と罪滅し編では違う画像になっています。そのどちらも使うために、下記のようなスクリプトを組みました。(前略) chnsa 5 bg "bmp\haikei\mori\mo1.jpg",1 \ chnsa 6 bg "bmp\haikei\mori\mo1.jpg",1 \ (後略)しかし、思ったように表示してくれません。どうしたらいいでしょうか?
これは、NScripterの仕様に基づく現象だと思われます。
同じ命令で同じ画像ファイル名を指定すると、前回のファイル名と比較して一致した場合はファイルの読み込みをしないようなのです。
今回はbg命令でそれが確認できましたが、他の命令でどうなるかはまだ確認していません。
ただ、この仕様の回避方法はあります。一度、別の背景画像に差し替えればいいのです。
その際は画面に反映させなければユーザーの目にその処理が触れることはありませんので、安心です。
下記のようにしてみてはいかがでしょうか?
(前略) chnsa 5 bg "bmp\haikei\mori\mo1.jpg",1 \ chnsa 6 bg black,0 ; ←この行を追加。一旦背景を内部的に真っ黒にしてみる。 bg "bmp\haikei\mori\mo1.jpg",1 \ (後略)
math.dll
この年になってC言語をやり始めるとは思わなかったよ。なんて言ったりして。
何かを学び始めるのに遅すぎるってことはないよな。
某氏からたきつけられて、C言語を使ってNScripter用のdllを作成してみた。
とりあえず、math.hに入っているような関数をそのままNScripterから使えるようにしてみたものです。また、それを使うためのNScripter側の準備もしてみました。
define_math.txt
numalias math_param1 numalias math_param2 numalias math_result numalias math_temp1 numalias math_temp2 numalias math_loop ------ ------ ;============================== ; アークタンジェント2 ; 引数は、%角度を受け取る変数,%距離を受け取る変数,%X座標,%Y座標 ;============================== *atan2 getparam i%math_result,i%math_loop,%math_param1,%math_param2 mov $math_temp1,"math.dll/510&" itoa $math_param1,%math_param1 itoa $math_param2,%math_param2 add $math_temp1,$math_param1 add $math_temp1,"&" add $math_temp1,$math_param2 exec_dll $math_temp1 getret %%math_result getret $math_temp2 atoi %%math_loop,$math_temp2 return ;============================== ; 平方根 ; 引数は、%結果を受け取る変数,%平方根を出したい変数 ; マイナスの数値を与えた場合、何もしない。 ;============================== *sqrt getparam i%math_result,%math_param1 if %math_param1<0 return if %math_param1=0 mov %%math_result,0:return mov $math_temp1,"math.dll/512&" itoa $math_param1,%math_param1 add $math_temp1,$math_param1 exec_dll $math_temp1 getret %%math_result return ;============================== ; 平方根2 ; 結果は1000倍された値になる。それ以外は何も変わらない。 ;============================== *sqrt2 getparam i%math_result,%math_param1 if %math_param1<0 return if %math_param1=0 mov %%math_result,0:return mov $math_temp1,"math.dll/513&" itoa $math_param1,%math_param1 add $math_temp1,$math_param1 exec_dll $math_temp1 getret %%math_result return ;============================== ; hypot - ユークリッド距離関数 ; 引数は、%結果を受け取る変数,%X座標,%Y座標 ; 原点と引数に与えた座標間の距離を返す。 ;============================== *hypot getparam i%math_result,%math_param1,%math_param2 mov $math_temp1,"math.dll/514&" itoa $math_param1,%math_param1 itoa $math_param2,%math_param2 add $math_temp1,$math_param1 add $math_temp1,"&" add $math_temp1,$math_param2 exec_dll $math_temp1 getret %%math_result return ;============================== ; hypot2 - ユークリッド距離関数2 ; 1000倍された距離を返す。それ以外はhypotと同じ。 ;============================== *hypot2 getparam i%math_result,%math_param1,%math_param2 mov $math_temp1,"math.dll/515&" itoa $math_param1,%math_param1 itoa $math_param2,%math_param2 add $math_temp1,$math_param1 add $math_temp1,"&" add $math_temp1,$math_param2 exec_dll $math_temp1 getret %%math_result return ;============================== ; 絶対値。引数をそのまま絶対値に変換する。 ;============================== *abs getparam i%math_result if %%math_result < 0 mul %%math_result,(-1) return ;============================== ; 絶対値。第一引数に第二引数の絶対値を代入する。 ;============================== *abs2 getparam i%math_result,%math_param1 if %math_param1 < 0 mul %math_param1,(-1) mov %%math_result,%math_param1 return ;============================== ; 端数切り上げ割り算 ;============================== *div2 getparam i%math_result,%math_param1 if %math_param1=0 inc %math_param1 mov %math_temp1,%%math_result mod %math_param1 div %%math_result,%math_param1 notif %math_temp1=0 inc %%math_result return
dll本体のダウンロード
ノート
某氏から「string.hが混じってる……」と指摘を受けたので、文字列関係の命令は別に切り出すことにした。
文字列系汎用ライブラリ
math.dll - 永字八法によって、汎用ライブラリ・define_math.txt - 永字八法から分離させられた部分。
スクリプト
------ ------ ;============================== ; 文字列の左側に追加をする。 ;============================== *left_add getparam s%math_result,$math_param1 add $math_param1,$%math_result mov $%math_result,$math_param1 return ;============================== ; 文字列を二つに分割する。右からn文字目で切り取る。 ;============================== *right_split getparam s%math_result,s%math_temp1,$math_param1,%math_param2 len %math_param1,$math_param1 sub %math_param1,%math_param2 mid $%math_result,$math_param1,0,%math_param1 mid $%math_temp1,$math_param1,%math_param1,%math_param2 return ;============================== ; 文字列を二つに分割する。右からn文字目で切り取る。2バイト文字用 ;============================== *right_split2 getparam s%math_result,s%math_temp1,$math_param1,%math_param2 len %math_param1,$math_param1 sub %math_param1,%math_param2*2 mid $%math_result,$math_param1,0,%math_param1 mid $%math_temp1,$math_param1,%math_param1,%math_param2*2 return
他に何か文字列関係で必要なものがあったっけ?
ベンチマーク実験
atan2が、スクリプト版とdll版の両方が出来たので、どちらが早いかをベンチマーク!
内容
xとyをそれぞれ-50から50の間で変化させて、10201の座標を作り、それぞれに対して二種類のatan2を実行し、その実行時間を調べる。
条件として、スクリプト版とdll版の順番を入れ替え、なおかつsaveoffするしないの都合4回を行うことにした。
結果
10201回の試行に対し、dll版は45秒前後で安定し、スクリプト版は50秒オーバーで安定した。これは条件をどのように入れ替えてもほぼ同じ結果になった。
つまり、dllを呼び出すオーバーヘッドを払ってもまだ速度的にはおつりが来ると言うことだ。
あーあ、これからは素直にdll使った方がマシってことか。
キャッスルやりてえなあ
でも、ソフトは売っちゃったんだよなあ……。