3月31日
αβεさんの御指摘により、mode800 の時の underline の初期値に関するバグを取りました。
αβεさんの御指摘により、cmp の戻値がおかしいバグを取りました。
コードの clean up をしました。
20020331a
大量にメモリリークしていたのを改善しました。
αβεさんの御指摘により、mode800 の時の underline の初期値に関するバグを取りました。
αβεさんの御指摘により、cmp の戻値がおかしいバグを取りました。
コードの clean up をしました。
大量にメモリリークしていたのを改善しました。
saveon, saveoff を実装しました。
forCommand, nextCommand の clean up と bufix をしました。
その他 bug fix をしました。
ショートカットキーの space が押された場合、マウスカーソルの下にボタンがあってもボタン外を押したことにしました。
セーブファイルに text の表示/非表示を示すフラグを格納する。以前のセーブファイルは次のようにして移行してください。末尾に 1byte (0x01) 追加するだけです。
echo -n '\001' >> save1.dat
sdl-fan-jp の Iguchi さんのパッチを取り入れ、MacOS X で CD-ROM を使わないようにするためのコードを修正しました。MacOS X で正常にコンパイルできるかどうか未検証だが、こちらの方がずっと綺麗。MacOS X での動作報告お願いします。
Takano さん adas さんから MacOS X 上での初動作報告をいただきました。いただいた Makefile.MacOSX を追加しました。
adas さんの御指摘により、SDL_image を使って画像を読み込む際、必要ライブラリ(libjpeg 等)未インストールのために読み込めず落ちる現象に対処しました。
textgosub, textbtnwait, getcursor, texec, ispage を仮実装。textgosub は一見正常に機能しているように見えるかもしれませんが、saveon, saveoff が未実装であるため textgosub 内からの save, load は正常には行えません(一応 save, load はできます)。他にも色々おかしいところがあるので、あくまで試験的なリリースだと思ってください。なお、textgosub を使用しないゲームについては 20020321a 同様に動作するはずです。
len を実装しました。
MacOS X で動作するように、コンパイル時に CD Audio 制御用の命令を #ifdef でスキップできるようにしました。
αβεさんの報告された、select の選択肢が文字列変数の時に生じるバグの原因を一昨日直したつもりが、検証が不十分だったため直しきれていませんでした。αβεさんの patch を参考に再度修正しました。
textoff, texton を実装。
αβεさんの御指摘により、表示文中に特殊命令以外のASCII文字を表示するようにしました。
効果 1 で wait を省いたら、busy loop になって入力を受け付けない状況が発生したため、開始時に wait を入れるように戻しました。
ついでに textspeed を実装しました。
富田さんの patch を参考に、--edit オプション指定時に z キーで音量・変数変更モードに入れるおまけ機能をつけました。この機能は暫定的なものであり、今後どうなるかは不明です。
αβεさんの御指摘をヒントに、命令文中に "" で囲まれた 2bytes 文字があった場合に、以降をテキスト文として解釈し変数を decode していたバグを取りました。
富田さんの patch を取り入れ、CD Audio で BGM 演奏する際に、再生トラック番号がセーブされないバグを取りました。
quakex, quakey, quake を実装しました。再現性に関して報告を募集しました。
select が複数行にまたがるときに、先頭が * ではじまることは許されないようです。TODO から削除しました。
select で "" を取り扱えるようにしました。
富田さんの patch を参考に getreg を実装しました。
erasetextwindow を実装しました。ただし、select や btnwait 時に文章と選択対象が重なる場合に正しく表示できないようです。
効果の 15, 18 を実装しました。ただし遅いです。
命令直後に表示文があると最初の文字が欠けるバグを取るました。
delayed effect が効いていなかったバグを取りました。というか、link 構造にする必要が全くありませんでした。仕様の勘違いです。とほほ。
起動オプションの --font で ttf フォントを指定できるようにしました。
アーカイブからデフォルトカーソルを読み込めるようにしました。
美しくないが文字列スプライトで文字列変数を使えるようにしました。そのために、readToken 系を、string_buffer のみではなく任意の char 配列から読めるようにしました。
起動時にコマンドラインオプションを取れるようにしましたる。
富田さんの patch を参考に CD audio による演奏を選択できる機能を追加しました。デフォルトでは mp3 ファイル演奏、--cdaudio オプションを付けて起動することで CD audio 演奏になります。
αβεさんの patch を参考に、再生中の track に対する play 命令を無視するようにしました。ただし、これが妥当な動作かどうかは未検証です。
αβεさんの patch を参考に、("")"true""false"の("")部に変数が使えないバグを取りました。
回想時にボタンの位置がおかしいバグを取りました。
コードの clean up とバグ取りをしました。
タグの読み取りで、アニメ指定の1コマの時間を解釈する個所を間違えていたバグを取りました。
s コマンドで文字から絵を作るときに、描画時ではなく生成時にその幅と高さを取得するようにしました。これで spbtn で使えるようになります。
回想時に select 文の文字が表示されないようにしました。
αβεさんの patch を取り入れ、nbz を解凍する際に無限ループに陥る場合があるバグに対処しました。
αβεさんの patch を取り入れ、select 画面で禁則処理が行われるようにしました。
select 待ちの時に、右クリックメニューから skip モードにすると select が選択状態になるバグを取るました。
某ゲームやっと終了しました。問題といえば quake が無いことくらいです。
("")"true""false"を実装しました。
sar は「泡沫」で使われていました。しかし、仕様書には載っていません。とりあえず nsa と同じ扱いにすることにしました。というわけで、sar を復活させました。
arc の引数に対応し、複数アーカイブを扱えるようにしました。
αβεさんの patch を取り入れ、caption を実装しました。
ONScripter の返すバージョンを 1.96 にしました。
movl を実装しました。
配列を 0 で初期化するようにしました。
αβεさんの patch を取り入れ、setwindow で指定したウィンドウ画像のαブレンディングがおかしいバグを取りました。
αβεさんの御指摘により、rmode 0 にしても、右クリックに反応してしまうバグを取る。roff を実装しました。
exbtn, exbtn_d, spstr を実装しました。
αβεさんの御指摘により、右クリックメニューで選択肢以外をクリックすると処理が止まるバグを取りました。
sar なんて命令ないんじゃない?なんでいれたんだろ?というわけで削除しました。
btnwait の時に、skip mode を off にするようにしました。
trap を実装しました。
spbtn の取り扱いの高速化しました。
省略値かどうかを検出し一つのコマンドの区切りを正確に判断することで、コマンドの区切りが':'で無い場合も取り扱えるようにしました。
グラフィックのタグ指定の透過形式指定に r を追加+画像取り扱い周りのバグを修正しました。
btnwait で、テキストを消し描画用に画面を描き直しました。
cell, spbtn を実装しました。
defvoicevol, defsevol, defmp3vol を実装しました。
voicevol, sevol, mp3vol を実装しました。
wave 演奏を SDL_Mixer の MIX_CHANNELS(=8) チャンネル分同時に鳴らせるようにし、wave コマンドは 1 番に、dwave の 0-7 はそのまま、8 以降は 7 番に割り付けるようにしました。
mp3 を演奏するときに、今までは SDL_sound で読み込み SDL_mixer で他の音とミックスしていたのですが、これだとボリュームを変更できないという問題がありました。そこで、SMPEG を直接用いて読み込み SDL_mixer で合成し、SMPEG_setvolume を直接使ってボリュームを変えるようにしました。結果として、SDL_sound が不必要になりました。
αβεさんの御指摘により、/コマンド(直後の改行無視)の扱いのバグを取りました。
αβεさんの御指摘により、"ー"を禁則文字に追加しました。
αβεさんの御要望により、selnum を実装しました。
btndef clear に対応しました。しかし、ONScripter では "" で囲まれた文字列と素の文字列を区別しないため、"clear" という名前の画像を指定すると、btndef clear として認識されてしまいます。しかし、どうやら clear という名前の画像が指定されることはなさそうなので、よしとします。
skip でラベルをまたぐときに正しい位置に行かないバグを取りました。よく今まで動いていたものです。
連続する空白をスキップするコードが、最初の一つしかスキップしないようになっていたバグを取りました。
blt を中間 surface を経由しないようにし高速化しました。
setwindow, menusetwindow の色味モードと画像ファイルモードにまともに対応しました。
mov3 - mov10 を実装しました。
デフォルトのテキストスピードをそれぞれ2倍に変更しました。
αβεさんの patch を取り入れ、abssetcursor を実装しました。
αβεさんの御指摘により、readInt で省略値を読み込む際のバグを直しました。
Nbz decode を実装しました。これにより、必要なライブラリに bzip2 が加わりました。
bg#000000, ... のように、# が前の token と隣接している場合にも取り扱えるようにしました。
画像ファイルが存在しなくともゲームを続行するようにしました。
skip mode もしくは1ページ表示で select 待ちに行き、そこで右クリックメニューに行ってまた select 待ちに戻ってきたときに、カーソルが表示されマウス操作が不可能になることがあるバグを直しました。
本日3回目のアップです。上の変更にともない skip mode もしくは1ページ表示でカーソル待ちの扱いがおかしくなったバグを取りました。
ScriptParser の Script を解釈する部分を大幅に変更し、配列に対応しました。
げげげー。仕様書にはスプライトが 0-49 とあるのに、実際には 0-255 らしいです。またセーブファイルを変更する必要があります。この際、取り得る範囲もセーブファイルに入れ、デフォルト値の変更に耐えられるようにしました。
あと、回想も無限にできるようにした方がいいようです。ここは将来直すとして、ついでに必要なパラメータをセーブファイルに追加しておきます。
btnwait2 を実装しました。
mid を実装しました。
800x600 モードを実装しました。
というわけで、言ったそばからまたセーブファイルの互換性がなくなりました。2月24日バージョンのセーブファイルから移行する場合は次のようにしてください。まず、2月26日バージョンのONScripterLabel::loadSaveFile( int no )を以下のように書き換えます。
/* ---------------------------------------- */ /* Load text history */ //loadInt( fp, &text_history_num );
/* ---------------------------------------- */ /* Load current sprites */ //for ( i=0 ; i<MAX_SPRITE_NUM ; i++ ){ for ( i=0 ; i<50 ; i++ ){
この状態でコンパイルしてゲームを起動し、移行するセーブファイルを一旦読み込みすぐに保存します。セーブファイルの書き換えが終わった後に ONScripterLabel::loadSaveFile( int no ) を元に戻すと、以後はこれを使って普通に遊べるようになります。
lookbackbutton, lookbackcolor, lookbackflush を実装しました。
回想モードを実装しました。これで文章履歴が見られます。
マウスカーソルが最初にボタンの上にある場合に選択状態にならないバグを直しました。
selectcolor, menuselectcolor を実装しました。
monocro 修正しました。なおこれに伴い、セーブファイルの互換性がなくなっています。
αβεさんの御指摘により、sprite の重ね合わせの順序が逆になっているバグを直しました。
αβεさんの御要望により、rmenu の状態をセーブファイルに入れました。これに伴い、セーブファイルの互換性がなくなっています。
αβεさんの御要望により、gettimer を実装しました。
セーブファイルの互換性がなくなることはなるべく避けるようにしていますが、今回は以前のバージョンが作成した save?.dat は全て消してください。ただし、かなりゲームが進行していてデータを継続して使いたい方のために、セーブファイルを移行する裏技があります。旧バージョンを持っている人は、新バージョンの関数 ONScripterLabel::loadSaveFile( int no ) を旧バージョンの関数 ONScripterLabel::loadSaveFile( int no ) で差し換え、コンパイルします。この状態でゲームを起動し、移行するセーブファイルを一旦読み込みすぐに保存します。この時、保存は新バージョンの形式でなされます。セーブファイルの書き換えが終わった後に ONScripterLabel::loadSaveFile( int no ) を差し換えない真っ新の新バージョンをコンパイルし、これを使って普通に遊べるようになります。ただし、この裏技は今回のバージョンアップではうまくいきますが、常にうまくいくとはかぎりません。
monocro 命令を実装しました。セーブファイルに monocro 命令の情報を追加しました。
select 命令でテキストが一行未満の時には、キーボードショートカットで選択肢を選ぶときに、マウスカーソルが行の中心ではなくテキストの中央にくるようにしました。
0.txt, 1.txt の連番ファイルで、ファイル末尾が改行文字で無い場合に正常に読み込めなかったバグを修正しました。
for, next, break 命令を実装しました。
intlimit, amsp 命令を実装しました。
命令の返り値が RET_JUMP の時に、timer event で executeLabel に飛んでいたのを、goto で executeLabel の最初に戻るようにしました。これで余計な時間待ちが減ります。
以上、雪を降らせるために努力をしてみましたが、スムーズに降りません。一カ所 timer event 待ちをしているところがあり、そこで引っ掛かっているのだと思いますが、すぐに回避策が思いつきません。保留にします。
select 命令で複数行中に空白行があると動作しないバグを修正しました。
delay, transmode 命令を実装しました。
マシンパワーによって画面効果の継続時間が異なっていため、画面効果命令で定められた時間内に終わるようにしました。CPU や描画速度に応じて、画面効果の描画間隔を調整するようにしました。
parseTaggedString のループ回数読み取り部分のバグを修正しました。
アニメーションカーソルを実装しました。これで、キー待ちとタイマ待ちを区別できるようになりました。
某ゲームのために、アーカイブを検索する前に現在のディレクトリを検索するようにしました。
保存ファイルを読み込むときに、ファイル名が書いてある場所以外をクリックすると固まるバグを修正しました。
!d 命令を実装しました。
今日 Windows で動かしてみたところ、スクリプトを読み込む段階で止まってしまいました。調べたら、なんと Windows と Linux で fread の戻り値の仕様が異なることが判明しました。今までよく Windows で動いていたと思いました。そういうわけで修正しました。
profiler でメモリリークを調べました。2個所でリークしていたため、解放するようにしました。
表示文で特殊文字しかない場合に改行しないようにしました。
stralias 命令で正しく復号されない場合があるバグを修正しました。se1? が全て se1 として解釈されていました。どおりで効果音が場面に合っていないと思っていました。
某サブシナリオを実行していたところ、画面のスクロールに必要だったため blt 命令を実装しました。ただし、拡大縮小には未対応です。
げげげ、もしかして savegame 命令と loadgame 命令を実装しないとゲームが進まないのではないのかという気が非常にしています。そういうわけで、savegame, loadgame 命令を実装しました。今までの進行は…。
セーブファイルから背景と立ち絵が正常に復元されない場合があるバグを修正しました。
文字の色変更を実装しました。
スクロール画面効果を実装しました。
date, time 命令を実装しました。
「ひとかた」では define 節の中で gosub 命令を使っており、ここで timer を使ってしまうため、ONScripter のコンストラクタの最後で define 節を読み、game 命令を実装してここで start 節に飛ぶようにしました。
「ひとかた」で、なぜかディレクトリのセパレータが arc.nsa と nscripter.dat とで異なっているため、ファイルの読み込みに失敗していました。それで、もしかしてと思い確認したところ、スクリプトの改行も 0x0a になっています。どうやら、Unix 上で作って、Nsa の圧縮だけ Windows でやっているようです。事前に Windows 用のセパレータに置換することで回避しました。
仕様書によると、画像タグ s を使う時に引用符で囲まれた区間にある stralias が展開されることになっていますが、その他の場合では引用符で囲まれた区間では展開されないようになっており、後から無理に命令を追加して仕様に一貫性が無くなっているように感じます。というよりも、自身のコードの一貫性が崩れるため実装したくありません。そういうわけで、stralias を展開しない形で画像タグ s を実装しました。
コードの変更にともない、セーブファイルの背景画像保存回りを更新しました。以前のセーブファイルと互換性が無くなりました。
vsp 命令を実装しました。これで「ひとかた」がほぼ動くようになりました。
jumpb 命令を実装しました。
HG ゴシックと HG 丸ゴシックフォントでは、embedded bitmap がないため全ての font size で正常に表示されるようです。
公開のために Web page を作り、ベータ版として公開しました。
DelayedInfo の変数の中身が変化することがあるため、元々のコマンドラインを再解釈するのではなく、展開されたコマンドラインを保存してそれを解釈するようにしました。
dwave, dwaveloop, dwavestop 命令を全てチャンネル 0 にマッピングすることにして実装しました。某ゲームでしゃべるようになりました。すごい、これでフルボイスを実現しています。
stop 命令を実装しました。
mp3, mp3save, mp3loop 命令を実装しました。アーカイブ埋め込みの MP3 演奏に対応しました。BGM とボイスがあると大分違います。
btnwait 命令と select 命令と右クリックメニューをキーボードのみで操作できるようにしました。これでキーボードのみで全ての操作が可能になりました。
btndef 命令を高速化しました。
click, mul, div, mod 命令を実装しました。
if 命令を強化しました。
itoa, atoi 命令を実装しました。
BaseReader から派生するクラスを大幅に変更し、arc1.nsa - arc9.nsa の複数アーカイブに対応させました。
公開に向けて大筋に関係ない細かい仕様の実装を始めました。
SMPEG の news group などを見て、smpeg on Win32 で global optimization を off にする区間を MPEGaudio::layer3reorderandantialias の関数に設定したところ、Win32 環境で MP3 が正常に演奏されるようになりました。素晴らしいです。前回は この関数から呼ばれる inline 関数の前後に入れたため、無視されているのではと思っていましたが、まさにその通りでした。
Win32 環境でのファイル時刻読み取りを実装しました。
resettimer, waittimer, autoclick 命令を実装しました。
clickstr 命令を実装しました。強制クリック待ちができるようになりました。
leaveTextDisplay で行っていた処理を timerEvent の先頭に持っていきました。これが筋ですし、懸案のバグも取れてかなり描画がスムーズになりました。
立ち絵とスプライトの前後関係が逆だったのを直しました。
キーボードの 1, 2, 3 で文字速度を切り替えられるようにしました。
右クリックメニューのうち windowerase と reset を実装しました。
なんと reset 命令でグローバル変数を初期化していたバグを直しました。
セーブファイルに文章履歴と setwindoweffect 命令のパラメータとその他の文章の状態とスプライト情報を含めるようにしました。
いきなり某ゲームを動かしてみたところ、動きはするものの、15pt 文字の表示がめちゃめちゃです。26pt だとうまくいきます。どうやら、SDL_ttf もしくは freetype2 が埋め込みビットマップに対応していないことが原因のようです。困りました…。
kochi フォントだと 17pt 以下が、MS フォントだと 22pt 以下がだめです。setwindow 命令で強制的に 18pt 以上にして動かします。
画像展開回りが遅いです。キャッシュなどの導入を検討した方がいいかもしれません。
オープニング途中で segmentation fault で落ちました。まだまだです。
!w 命令を実装しました。
windoweffect 命令の解釈のバグをとりました。
windows でビルドすると、コンパイラのチェックが厳しいため、Linux では気付きにくいバグが見つかることが多いです。いくつかバグを取りました。
enterTextDisplay で、既読文字がスムーズに表れるようにしました。
禁則処理を実装しました。
効果があるのかいまいち不明ですが、カーテンなどの画面効果を 16bit 間隔にしました。また、画面効果の処理時間間隔を 20msec から 10msec にしました。遅いマシンだとつらくなるかもしれません。
SDL_mixer を入れ、wave, waveloop, wavestop 命令を実装しました。mixer のまともなマニュアルがないので苦労しましたが、mp3 と同時に演奏できています。素晴らしいです。
NScrflog.dat を大文字にすべく、SarReader と NsaReader の内部では大文字で扱うことにしました。
lchk と labellog 命令を実装しました。NScrllog.dat の中身は同様に大文字です。
これで某ゲームは一通り動くようになったかもしれません?
humanz, lsp, lsph, csp 命令を実装しました。ようやくスプライトが実装されました。
立ち絵とスプライトのオーバーラップ処理をまともにしました。
filelog 命令を実装しました。BaseReader にアクセス状態を保存するフラグを入れました。notif 命令の実装が間違っていたのを訂正しました。これで、グラフィック一覧が正常に動くようになりました。ただし、本来は NScrflog.dat に格納される文字が大文字であるのに対し、今回の実装ではアーカイブの中の文字をそのまま使っています。
readLine の時点でテキスト行か否かを判定し、同時に1次 parse をし、readInt と readStr で2次 parse をするように直しました。
NSA の SPB を実装しました。元々は BMP で吐くようになっていますが、楽なので PPM で吐くようにしました。そのうち BMP にするかもしれません。BMP のヘッダの仕様を調べれば15分くらいで BMP に出来そうな気もしますが…。
「泡沫」のために、readToken で quat と 2bytes 文字以外の命令を大文字から小文字に変換するようにしました。
!sd を実装し、また sentence_font.wait_time が 0 になることがあったバグを直しました。
「泡沫」のために、立ち絵の透過形式の左上とコピーを実装しました。
セーブファイルに現在演奏中の CD track の番号を入れるようにしました。
bg 命令で立ち絵を除去する際に、状態変数をクリアしていなかったバグを取りました。
「泡沫」のために、デフォルトアーカイブを Direct から NSA に変更し、arc.nsa が開けないときには Direct でいくようにしました。
select 命令の後に enterNewPage を実行するようにしました。
某ゲームのために getversion, jumpf, rnd, rnd2 命令を実装しました。
NSA の lzss をさくっと実装しました。
ショックというかショックじゃないというか…。SPB の SPI の逆アセを始めたところで、既に実装してソースを公開している人を発見しました。同じ時期に同じことをやっており結構かぶっています。
play 命令もしくは playonce 命令が playstop 命令を挟まず連続した場合に、セグメンテーションフォルトを引き起こすバグを直しました。
某ゲームでグッドとトゥルーに行けることを確認しました。
昨日おかしかったところを直し、メニューバー以外は Qt の状態に復帰しました。
ファイルの修正時刻やパスの区切り文字など、ファイルアクセス関連が機種依存になっています。いいライブラリはないものでしょうか?
SDL_sound を入れ、さくっと MP3 演奏を実装しました。play, playonce, playstop 命令を実装しました。ただし、MIDI は無視し、CD 演奏は対応する MP3 演奏に割り付けるようにしました。BGM があるといいです。
Windows 用の Makefile を書き、Windows でコンパイルしてみました。思ったよりも表示がもたつきますが、問題なくコンパイルでき、文字・音楽・効果を含めて実行できました。ただ、機種依存の searchSaveFiles() は未実装です。
音楽再生を実装しようとして Qt の限界を感じました。libmad や libsmpeg などの使用も考えましたが、ここにきて結局 Qt から SDL に移行することにしました。そもそも開発前に Qt でいくか SDL でいくか迷ったのですが、SDL をよく調べなかったせいもあり使いなれていた Qt にしてしまった経緯があります。
JPEG 画像の読み込みを試し、また sjis2utf16 を書いて TTF を使った日本語描画を試しました。文字のアンチエイリアシングが素晴らしいです。フォントファイルを直接指定しなければいけないのが難点ですが。画面の bit 転送も Qt とくらべて速そうですし、alpha blend も未検証ですが速そうです。欠点と言えば、メニューバーを自前で実装しなければいけないことくらいですが、今はメニューバーをほとんど使っていないので構いません。実装自体も簡単そうです。
というわけで、一日かけて移植しました。8割方移植が終了しました。GUI を外して、Blit 命令を置換するだけでほぼ済みました。enterTextDisplay と rmenu 周りが若干おかしいくらいです。
ファイル名を QNScripter 系に統一し、copyright を入れ、ライセンスを GPL にしました。
Makefile を Linux 用と Windows 用に分けました。Windows 用は書いただけで未試行です。
文章履歴の保存を実装し、表示部分は完成しました。履歴のセーブはまだです。
テスト実行中のループで引っ掛かり先に進めなくなったので、dec 命令を実装しました。
テキストウィンドウがフェードインするときに画面効果が適用されるようにしました。
文章履歴用のリングバッファを作りました。
「ハーバー」で立ち絵の位置がおかしいので、underline 命令を実装し、立ち絵の下限の位置を underline に合わせるようにしました。
locate 命令を実装しました。
windoweffect 命令を実装し、テキストウィンドウがフェードアウトするときに画面効果が適用されるようにしました。フェードインの場合は未実装です。skip と one page をきちんと実装しました。テキスト表示中に画像が追加される場合に、既表示のテキストが消えてしまうバグを何とかしたいです。文章履歴保存を兼ねて、バッファリングしておいて最描画するのがよさそうです。
save, load 命令を実装しました。入れ子を含む現在の状態と変数と背景と立ち絵の情報が保存ができます。後はテキストとスプライトとカーソルの保存ができればよいのでしょうか?
curtain 効果を実装しましたが、かなり遅いです。
テキストのクリック待ちのときに、space キーと return キーで先に進めるようにしました。
systemcall 命令を実装しました。
selgosub 命令を実装しました。
WAIT_BUTTON_MODE を追加し、btnwait 命令で右クリックメニューが無効になるようにしました。
「ハーバーランドでつかまえて」(以下「ハーバー」)を動かすテストをしていて、bg 命令で小さな画像を読み込むときの問題を直している時に、偶然、占有メモリが増えていくバグの原因を発見しました。単なる delete のし忘れでしたが、qnscripter ではなく XFree 側のメモリが増えていくところが嫌らしいです。これで全くメモリリークがなくなりました。