<   2007年 06月 ( 17 )   > この月の画像一覧
簡易スタックver3
 簡易スタックver2の続き。
 また簡易スタックをバージョンアップさせました。
 変更点は
・スタック番号制導入
・スタックのサイズ(要素数ではない)を取得するget_stack_size命令を追加
 といったところです。
 スタック番号は1~10まであり、文字列スタックと数字スタックそれぞれに存在します。これらのスタックは別扱いなので、例えば両者間で同じスタック番号を使いまわしても問題ありません(文字列スタックでスタック番号1、数字スタックでも同じくスタック番号1、なんて場合もOK)。

 そろそろちゃんと簡易スタックで使っているアルゴリズムの説明をすべきだよなぁと思いつつも「改良したい!」という思いが先に立ってしまうため後回しにしちゃってます。
 次は簡易スタックのアルゴリズム解説記事を書くか、せっかくスタックが使えるようになったんだからgosubやdefsub内で安心して使えるような一時変数を用意するTempライブラリを作るかしたいです。
[PR]
by lyricist_m | 2007-06-29 20:37 | NScripter
簡易スタックver2
 簡易スタックの続き。
 簡易スタックをバージョンアップさせました。
 前バージョンでは文字列スタックしか扱えませんでしたが、ver2では文字列スタックと数字スタックの2種類のスタックを扱えるようになっています。
 あとreadmeに書き忘れましたが、スタックの要素数を返すlen_stack命令と先頭の要素を取り出さずに参照のみを行うことができるpeek_str/peek_num命令も追加してあります。
 これでそこそこ使えるようにはなったと思いますが、現時点では文字列スタックで1個、数字スタックで1個の合計2個のスタックしか扱えません。できれば複数個のスタックを扱えるように改良したいところです。
[PR]
by lyricist_m | 2007-06-27 18:30 | NScripter
atoiとitoaに対する違和感
 atoi命令とitoa命令を使っていて、何かしらの違和感を感じていたのだが、最近まで理由がわからなかった。
 だが間違ったコードは間違って見えるようにする - The Joel on Software Translation Projectという記事を読んでようやくその正体がわかった。つまり、命令名のa(ascii)とi(integer)の順番が、引数の順番とは逆であるために違和感があったのだ。
 atoi命令の場合、第一引数は変換結果の数字を引き取る数字変数で第二引数は変換元となる文字列で、命令名はその反対で先にa(ascii)が来て次にi(integer)が来る。itoa命令の場合はこの逆だ。
 製作中のライブラリでは、上記記事のようにnumFromStr或いはstrFromNumとしようかと考えているが、むしろ「これらの命令は逆になってるんだ」と覚えてしまう方がいいのかもしれない。
[PR]
by lyricist_m | 2007-06-27 14:07 | NScripter
簡易スタック
 簡易スタックを実装してみました。サンプルはいつものごとく本家のNScripterページから。
 この簡易スタックは文字変数1個で実装してます。
 なので、あまりpushしすぎると(あるいは1個の要素が大きすぎると)すぐオーバーフローしてしまうかもしれません。具体的に言うと文字変数が1000バイト以上(半角文字が1000個以上)になったらエラーが出るように設定してあります。
 また、要素数が多い場合に速度に問題が出るかもしれません。
 ですが、ちょこっと使いたい場合にはこんなんでたぶんいいんじゃないでしょうか。

 本当は今日、穴掘り法で迷路自動生成をやるはずだったんですが、穴掘り法はスタック使うところがあるらしいのでスタックを実装せねばーとやり始め、いつの間にか迷路自動生成よりスタック実装に力が入ってました。構想10分、実装30分、テスト数時間?ってところでしょうか。お陰で穴掘り法はまだできてません。明日こそは……!
[PR]
by lyricist_m | 2007-06-26 22:38 | NScripter
限界シリーズ 変数・CSV編
 またNScripterの限界ついて判明したことがあるので、書きとめておこうと思います。

 まずは、変数に一度に代入できる最大の数。調査方法は、半角の場合
mov $0,"00...0"
 また、全角の場合
mov $0,"ああ...あ"
 といった形式である。
・文字列の場合。半角で2046文字、全角で1023文字まで大丈夫のようだ。それを超えるとエラーが発生してNScripterが落ちてしまう。
・数字の場合は2147483647~-2147483648。それを超えるとオーバーフロー(アンダーフロー)が起こる。

 次にCSVファイルに一度に書き込める最大の数。つまりはcsvwrite命令に渡せる最大値ということになる。
・文字列の場合、半角512文字、全角255文字までOK。それを超えると「Buffer overrun detected!」となりNScripterが強制終了する。
・数字の場合は変数の限界と同様。

 これらはあくまで「一度に」処理した場合であり、限界に近い値を個別になども処理した場合などは最大数が変化するかもしれない。事実、変数の限界を調べている時に、for文で回して処理をしていたら半角が1550文字でエラーになった。

 ちなみに、なんで限界を調べようと思ったかというと、スタックを実装するのに必要だから。
 スタックに関しては一応実装できたんで、また後で記事書きます。
[PR]
by lyricist_m | 2007-06-26 19:30 | NScripter
棒倒し法
 棒倒し法で迷路を自動生成するスクリプトを組んでみたので、とりあえずアップだけでもしてみる。いつものごとく本家のNScripterページからダウンロードできます。
 周囲が壁に囲まれているせいか、最後がもたつくのが問題。改善したい。
[PR]
by lyricist_m | 2007-06-25 23:24 | NScripter
notifの挙動
 lspを上書きして「スプライト番号が0未満、或いは1000以上の時に警告を出して終了する」ようにしようとしたんですよ。
 普段なら、こういう条件(論理和)の時はif文を二つ書いて対処してるんですが、「notifで出来るんじゃないか」と思って試しに
notif %0 >= 0 && %0 < 1000
 と書いてみたところ、意図した通りに動作しませんでした。
 C言語で書くと
if (!(x >= 0 && x < 1000))
 こんな感じの動作をしてくれるかなーと思ったんですが、結果は完全に素通り……。
 もしかして、片方でも条件が成立してしまえば無条件で比較を中止して処理を次の行に移してしまうのだろうか。内部的にif文を使いまわしてるようだったらありえそうだなぁ……。
[PR]
by lyricist_m | 2007-06-21 19:18 | NScripter
setwindowの仕様
textwindowライブラリ作成中に調べてわかったことあれこれ。

・パラメータ7、8個目の文字間隔に値を指定すると、表示する文字の下側、右側にスペースが空けられる。ルビを使用する時は1行目の上のスペースを空けること。ルビがテキストウィンドウをはみ出してもエラーは出ない、だがNScripterのウィンドウからはみ出すとエラーが出て落ちる。
・「文字がウィンドウをはみ出した」とエラーになるのは、文字がテキストウィンドウの端に乗った時。例えばテキストウィンドウの右端座標がX=639の場合、文字が639まで来るとエラーになる。638までならOK。ギリギリまで使おうとするとエラーになるので注意。
・太字フラグ、影付きフラグを立てても座標系(フォントの位置とかサイズとか)には影響を及ぼさない。両フラグを立てて限界(先の例で言うなら638)まで文字が来ても大丈夫。スプライト系でこれらのフラグを立てると座標系に影響があると聞いたけど、こっちは未検証。



 ついでにtextwindowライブラリの仕様も段々固まってきたんで書いときましょう。
 textwindowライブラリでは、set系の命令とchange系の命令を実装しようと思います。
 set系の命令はsetTextWindow命令と併用します。set系の命令で個々の値を指定し、最後にsetTextWindow命令で実行する、といった形です。
 change系の命令は一つの項目だけ変更したい場合に使います。たとえばフォントサイズだけ変更したいとか、ウィンドウの色味だけ変えたいとか。内部的にはset系の命令一つ+setTextWindow命令の形になります。
 setTextWindow命令には自動調節機能を持たせます。例えばset系の命令でフォントサイズのみ変更した場合、文字がウィンドウからはみ出したり余白が空いたりしないように横の文字数を計算し自動的に設定する、といった感じです。自動調節機能無しのsetTextWindowや単なるsetwindowのラッパーも用意しようと思います。

 仕様が固まってきたのはいいけど実装完了にどんだけ時間がかかるやら……。
[PR]
by lyricist_m | 2007-06-19 13:20 | NScripter
setwindowラッパーテスト2
 setwindowラッパーテストを修正してver2にしておきました。本家からDLできます。詳しくは同梱のreadme.txtをお読みくださいませ。



 と、これだけじゃ何なので。
 最初はtextライブラリに含めようと思っていたtextwindow周りですが、textwindowで独立させてしまおうと思います。
 内部でtextライブラリに含まれている命令が必要になりそうですが、その必要な命令だけtextwindow内部のみで使う命令として移殖すれば独立性を保てるんじゃないでしょうか。これも完成したら公開しますね。
[PR]
by lyricist_m | 2007-06-14 20:49 | NScripter
BGMのフェードイン・フェードアウト
 NScripterでBGMを個別にフェードイン・フェードアウトさせる(吉里吉里でいうfadeinbgmタグ、fadeoutbgmタグ)のは命令が用意されてないから無理なのかなーって思っていたんですが、bgmfadein命令とbgmfadeout命令を使えばできるんですね。設定系の命令なんで、定義節専用だと思い込んでましたよ。
 てことで、こんな命令作りました。

*playfadein
getparam $0,%0
bgmfadein %0
bgm $0
bgmfadein 0
return


*stopfadeout
getparam %0
bgmfadeout %0
stop
bgmfadeout 0
return

 playfadeinでは再生するファイル名とフェードインする時間を、stopfadeoutではフェードアウトする時間のみを受け取り、指定した時間だけフェードさせながら再生・停止してくれます。ここでは再生・停止後、フェードの設定を0にしていますが、基本的に1000ミリ秒フェードさせたいけど場所によってはこれらの命令でフェードを500にして再生・停止させたいな、などという場合はちょっと手を入れる必要があります。
 まず定義節でbgmfadein命令、bgmfadeout命令をそれぞれ使用し、指定した時間をグローバル変数に確保します。あとはplayfadein・stopfadeout内部で設定を一時変更して再生・停止したあと、フェードの設定に先ほどのグローバル変数を指定すればオッケーです。
[PR]
by lyricist_m | 2007-06-11 17:30 | NScripter