<   2009年 01月 ( 9 )   > この月の画像一覧
プラグインの重複登録
 wuvorbis.dllとかdirlist.dllとかを登録する際の話。
 登録にはPluginsクラスのlinkメソッドを使う。間違えて複数回登録しちゃった、なんて場合でも問題はないようだけど、メリットがあるわけでもない。なので「既に登録してないか確認してから登録する」ようにした。

if(Plugins.getList().find("lineParser.dll") == -1) Plugins.link("lineParser.dll");

 例えばプラグインを必要とするスクリプトが複数個所あっても、こう書いておけば読み込むのは1個だけ。インクルードガードみたいな感じですね。
[PR]
by lyricist_m | 2009-01-28 23:17 | 吉里吉里/TJS2
吉里吉里始めました。
 始めてどれくらいになるか忘れてしまったのですが、吉里吉里を弄ってます。
 一つのブログで複数の話題を扱うのがあまり好きではないので、そのうち吉里吉里専用ブログを立ち上げるかもしれませんが、当面はこっちで吉里吉里ネタの記事も書いていこうかと思います。
[PR]
by lyricist_m | 2009-01-28 19:36 | 吉里吉里/TJS2
savegame
 ふと気になったので、savegame命令周りについて調べてみました。

 savegame命令は引数として2147483647~-2147483648までの値を受け取れます。つまり、最大で約43億個のセーブデータを作れます。マイナスの値を指定した場合、ファイル名はsave-1.datのようになります。
 全ての変数に何の値も格納していない素の状態の場合、セーブファイルの容量は約36KB。文字変数に値を格納すると容量が増えます。数字変数の場合は、格納する値の大小によらず容量は一定です。
 また、セーブファイルの容量を決定する要因の一つとして、グローバル変数があります。グローバル変数は基本的に変数番号100200番からですが、value命令によって変えることが可能です。value命令によってグローバル変数の開始番号を500、1000、2000……と後にずらせばずらすほど、セーブデータに格納するべき普通の変数の値が増えるので、その分セーブデータの容量も増加し、それとは反対にgloval.savの容量が減少します。

 errorsave命令のセーブ番号が999なので1000以上はセーブできないんじゃないかという思い込みがあったのですが、思いのほか沢山セーブできるようですね。さすがに43億個をフルに使うことはないでしょうが。セーブデータだけでテラに到達しますしね。

[追記]
 間違っていた点があったので修正。
[PR]
by lyricist_m | 2009-01-27 15:36 | NScripter
セーブデータの有効活用
 シナリオの節目節目で自動的にセーブしておき、プレイヤーがセーブする際に同時に節目のセーブデータも保存。ロードする際に「セーブしたところから始める」「節目から始める(その日の朝から、一つ前のブロックから、など)」と表示すると便利じゃないかな? と思った。
 自分はセーブデータからゲームを始める際、まずは回想して現在の状況を確認してから再開するので、上のようにすると手間が省けそうだな、と。
[PR]
by lyricist_m | 2009-01-26 01:33 | NScripter
シナリオプレイヤーについて考える。
 シナリオの構造について、以下の様に考えました。
 点線以下の部分は同様の要素が複数あると思ってください。

Scenario
┣Part
┃ ┣Scene
┃ ┃ ┣Block
┃ ┃ ┃ ┣Route
┃ ┃ ┃ ┃ ┣Label
┃ ┃ ┃ ┃ ┗Flags
・  ・  ・  ・
・  ・  ・  ・
・  ・  ・  ・

 シナリオ全体をまとめるScenario要素の一つ下にPart要素があります。これはシナリオプレイヤーでは考慮しない要素で、人間がシナリオを管理する際に用います(ゲーム内1日分とか)。
 その下のScene要素はシーン回想をする際に再生対象となる内容で、実際にテキストが含まれるのはその更に下、Block要素になります。
 Block要素は1つ以上のRoute要素を持っています。これが分岐にあたります。Route要素にはLabel要素とFlags要素があります。Label要素は次のBlock要素を指定するもので、Flags要素には条件が複数格納されています。Flags要素の条件が全て真ならLabel要素に飛ぶ、という感じになります。

 大方こんな感じなのですが、あと問題は選択肢をどうしようかなってところです。今考えてるのはBlock要素をテキストブロックと選択肢ブロックの2タイプに分けるとか。
[PR]
by lyricist_m | 2009-01-25 15:01 | NScripter
先送り機能について考える。
 シナリオを先送りできるということは、シナリオの先を取得できていて、尚且つ任意の場所にジャンプできないといけない。ということは、各ページごとにラベルが必要なのでは。
 どうもNScripterでは実装が無理な気がする。やるなら吉里吉里だろうか。

 あと、先送りが出来るということは、自分が作った回想における巻き戻し機能じゃなくて、完全な意味での巻き戻しが出来るのではないだろうか。前に飛ぶか後ろに飛ぶかの違いしかないわけだから。

 まず思いついたのは、シナリオファイルの内容を一旦配列か何かにぶち込んで、そこから1行ずつ読み出して実行、ジャンプする時は配列の添え字を変える、という方法。
 ただ、これって既読判定とかどうするんだろう。シナリオブロックごとに既読判定とか?
 うーん、やっぱり難しそう。
[PR]
by lyricist_m | 2009-01-25 03:29 | NScripter
巻き戻し機能
 巻き戻し機能のサンプルを作成しました。Delusionist's Utopiaから落とせます。
 以前作った循環バッファ+回想のサンプルに手を入れてさっくり作成。そんなに手間はかかりませんでした。変数番号がバッティングしていることに気付かなくて「なんでバグるんだ?」と頭を抱えることはありましたが。

 やってることを簡単に説明します。
 まずは背景と立ち絵のファイル名を格納する変数を用意します。立ち絵は左、真ん中、右と場所ごとに準備。次にbg、ld、cl命令を上書きして、表示中のファイルを保存できるようにします。そして改ページの時にそれらをログと一緒に保存すればOK。あとは回想モード中に、ログと一緒にファイル情報を取り出して表示すれば、目的が達成できます。

 やはりそんなに難しくありませんでしたね。今度からうちのゲームに実装しようかな。
 次はシナリオプレイヤーに関する話でも。
[PR]
by lyricist_m | 2009-01-24 23:25 | NScripter
構想
 現在構想中のシステムとか製作支援ツールとかの話。
 ノベルゲーム製作全般に関する話で、NScripterに限ったものではないのですが、一応NScripterカテゴリにしておきます。

 とりあえず全部箇条書きにするとこんな感じ。
・巻き戻し機能
・先送り機能
・演出指定GUIツール
・シナリオ分岐指定GUIツール&シナリオプレイヤー

 以下、各項目の説明。長くなると思うので畳みます。

More
[PR]
by lyricist_m | 2009-01-23 11:26 | NScripter
復活
 お久しぶりです。とりあえず生きてます。
 かなり久しぶりに自分のブログを開きました。設定画面が様変わりしていてびっくり。

 前回の更新から今まで、あまり自由な時間は無かったのですが、スクリプト周りの構想はたまってるので、次に書く記事で軽くまとめようと思います。とりあえず今は生存報告まで。

 あ、あと今年もよろしくお願いします。
[PR]
by lyricist_m | 2009-01-22 18:27 | 日常