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が混じってる……」と指摘を受けたので、文字列関係の命令は別に切り出すことにした。