ONScripter 開発日誌

Since: Feb. 6, 2002
Last updated: Mar. 23, 2003

2003年1月~3月

3月23日

αβεさんの patch を取り入れ、 arc でアーカイブファイルが見つからなくても処理を継続するように修正しました。

αβεさんの patch を取り入れ、reset で一時的にテキストが残ってしまうことがある不具合を修正しました。

αβεさんの patch を参考に、menusetwindow で背景色が省略されている場合(デフォルト値: #999999)の対応を追加しました。

αβεさんの patch を取り入れ、Ctrl キーでのスキップ機能を追加しました。

αβεさんの patch を取り入れ、Shift+'Q'で強制的に end を実行するように拡張しました。これは前から入れたかったのですが、簡単に押せるキーだと間違って押してしまう可能性があり、どうしようかと思っていたところでした。

そ~かむさんの patch を参考に、MacOS X での MIDI 演奏に対応しました。現在の SDL on MacOSX では MIDI が演奏できないため、別途そ~かむさんに作成していただいた ONScripter ランチャのMIDI再生補助機能に対応するための修正を行いました。これは SDL での不具合が解消されるまでの暫定的な処置になります。この ONScripter ランチャを含んだバイナリについては、ONScripter for MacOS X(かつらさん)からダウンロードできるようになる予定です。

20030323a

そ~かむさんの patch に関連して、私が誤った修正をしてしまった箇所を直しました。

3月16日

効果番号15番が正常に描画されなくなっていたバグを修正しました。

alpha blending を書き直し高速化しました。

文字のクリッピングに関するバグを修正しました。

PDA および blt 用の画像の解像度変更ルーチンを、3x3 平滑化フィルタ+ bi-linear 補間に変更しました。さらに、コンバータとルーチンを共通化しました。これでかなり綺麗に縮むようになりました。PDA でアーカイブを圧縮している人は、今回のコンバータで圧縮し直すことをお勧めします。ただし、補間をしている関係上、アルファ付き画像の縁が線として見えたり、特定色で抜いているカーソル画像の特定色境界が見えたりしますが、これはトレードオフなので我慢してください。デスクトップマシンでも、-DPDA 付きでコンパイルすることで、効果を試すことができます。

3月6日

s1100089さんからのバグ報告をもとに、goto の引数が文字列変数($で始まる)の場合、正しく扱えていなかったバグを修正しました。parser を変更したときにエンバグしたようです。

3月2日

s1100089さんからのバグ報告をもとに、行のそれ以前に2byte文字(テキスト)が無い状態で@が現れたときに改行していたバグを取りました。

3月1日

だいぶ遅くなりましたが、beroさんに報告していただいたバグを修正しました。また、ONScripter for Dreamcastへのリンクを追加しました。

2月22日

beroさんにDreamcastでの動作報告をいただきました。同時に報告していただいたバグについては、近日中に修正したものをリリースいたします。

2月10日

かつをのえぼしさんに、ONScripter のWindows バイナリを公開していただきました。本来 Windows 上では製品付属のNScripterを使用すればよいのですが、ONScripter とNScripterとではセーブファイルに互換性が無いため、例えば外では PDA(SLシリーズのザウルス)、家では Windows でやりたいという方にはお勧めです。

2月8日

ADPCM の wave ファイルを bgm, mp3 で演奏できるように修正しました。

soundpressplgin, spi に暫定対応しました。指定された拡張子を NBZ 復号するようにします。そもそも、spi や soundpressplgin によるデコード処理はアーカイブ側でやるべきではないのですが、ONScripter ではどのみち DLL を使用できないため、NBZ を仮定して便宜上アーカイブ側で復号するようにしています。

命令後の@や\の取り扱いや、#(色指定)のみの行の取り扱いの不具合を修正しました。

試しにとったhttp://galileo.spaceports.com/~ogapee/onscripter.htmlが、なぜかαβεさんに補足されています。しかし、ここはさしあたり更新しません。現行のスペースが使えなくなった場合にバックアップとして使用します。

2月6日

ページ公開から一周年です。

かつらさんに ONScripter for MacOS X を公開していただきました。Mac OS X ユーザの方でONScripterのコンパイルに苦労されている方は是非お試し下さい。

2月4日20030128~20030202 を使っている人は、要差し換え。セーブファイルが壊れています。

かつらさんからのバグ報告を元に、20030128以降でセーブファイルが正常に作成されない不具合を修正しました。たいへん申し訳ありませんが、20030128 および 20030202 で作成したセーブファイルは破棄して下さい。

遠藤さんからのバグ報告を元に、puttext 後の改行に関する不具合を修正しました。

αβεさんの patch を取り入れ、getreg の不具合を修正しました。

mask 指定の不具合を修正しました。

アーカイブ圧縮時に、左上もしくは右上のピクセルを透過色に指定している画像の場合に、補間の影響によって透過色が正しく反映されない場合があったため、補間方法を従来の bi-linear に戻しました。

2月2日

nsaconv, sarconv の画像解像度変更ルーチンにおいて、メモリを正しく確保していないバグを修正しました。

A.Bさんからの報告を元に、(条件ファイル名)"TRUE文字列""FALSE文字列"の解釈におけるバグを修正しました。

1月28日

αβεさんの patch を参考に、lsp で mask や string 指定を解釈する際のバグを取りました。プログラムが終了してしまう重大なバグなので、20030126 を使っている人は必ず更新してください。

1月26日

αβεさんの patch を取り入れ、ファイル直接読み込み(DirectReader)時に ファイルが見付からなければ、ファイル名を大小文字区別せずに検索して読み込むよう修正しました。(Win32 以外) (注: ディレクトリ名を区別しないようにはなってません。 その辺にも対応するとしたら、 もっとまともな実装方法にする必要があります)

αβεさんの patch を参考に、ファイル直接読み込み(DirectReader)時にファイルが無圧縮の場合のファイルサイズを正しく扱えていなかったバグを修正しました。

αβεさんの patch を参考に、nsa で arc.nsa が見付からない場合に続行するように修正しました。

αβεさんの patch を取り入れ、reset 時に font の色を reset しないように修正しました。

αβεさんの patch を参考に、readToken で、現状態がテキストではない場合、'\'や'@'を区切りとして解釈するように変更しました。goto 等で指定ラベルの後に '\' 等の ゴミがあった場合に対する修正です。

数字の式( mov %0,1+(2*%4+(5-3 mod 2)) など)に対応しました。parser にかなり大掛かりな変更を加えました。エンバグしている可能性があります。

以下は内部関数の説明です。

  • readStr() 命令文引数の文字列・色、もしくはテキスト途中の文字列変数を読む
  • readInf() 命令文引数の数字、もしくはテキスト途中の数字変数を読む
  • readToken() 命令文自体、ラベル、テキスト文章およびその他を読む

nsaconv を圧縮後 640x480 モードに対応しました。-e オプションを組み合わせることにより、640x480→640x480 もしくは 800x600→640x480 の変換でよく縮みます。

-e 付き 640x480 にしてギリギリ512MBのCFに収まるゲームをやってみました。swap を 64MB とって、なんとか正常に動きました。ただし、無視できますが、メモリー不足というウィンドウが頻繁に出ます。free で見ると、used が瞬間最大風速 Mem: 29604, Swap: 57684, Total 87288 までいきます。このゲームは特に同時使用画像量が多いと思うのですが、一般にVGA だとデータ量も半端ではないので、使われていない画像データを一時的に解放する機構を実装しないときついかもしれません。画面は非常に綺麗です。

640x480→640x480 の場合は、onscripter-cf, onscripter-sdのアイコンを使ってください。800x600→640x480の場合は、対応するアイコンを作ってないので、コンソールから以下のように実行してください。そのうちに launcher を作ります。

onscripter --root /mnt/cf/nscr --force-button-shortcut --disable-rescale 

free.prohosting.comは一回限りだという支払いをしないとアカウントを抹消される可能性が濃厚なので、tripod.co.jpに移転しました。

1月21日

藤田さんが ONScripter の Free BSD Ports を公開してくださったので、リンクを張りました。

1月6日

sarconv, nsaconv の解像度変更を、2x2近傍バイリニア補間から4x4近傍重み付きバイリニア補間に変更しました。少しはきれいになったでしょうか?

1月2日

Zaurus で入力を受け付けなくなる現象ですが、Frame Buffer Driver のロックに関するSDL on Qtopiaの不具合が原因でした。SL-C700以外ではこの不具合はでないようなので、VGAとQVGAの切り替えに関する部分と干渉していたのだと思います。

以下は探求の軌跡です。

  1. まず、マルチスレッド関連で dead lock になっていることを疑いました。ところが、アプリケーション内のQt 関連の部分は single thread で動いており、これは入力を受け付けなくなっても動いているため、アプリケーション内部では dead lock していないようです。つまり、ONScripterLabel::eventLoop の中で以下のループ自体は正常に回っていますが、Key event や Mouse event が QApplication に来なくなっているようです。
    ONScripterLabel::eventLoop{
      SDL_WaitEvent  
        SDL_PumpEvents
          qApp->processEvents
            qt_fbdpy->getEvent (Frame Buffer Driverからイベントを受け取る)
              qwsProcessEvent (widgetへイベント発行)
                widget->###event(widgetのイベント処理)
                  SDL_Private####(SDL のイベントをキューへ)
            select (時間制限つきイベント待ち)
              widget->event(widgetへイベント発行)
                widget->###event(widgetのイベント処理)
                  SDL_Private####(SDL のイベントをキューへ)
        SDL_PeepEvents(SDL イベントキューからイベントを取り出す)
      ONScripter でのSDLイベントの処理
    }
    
  2. 次に、某ゲームで入力を受け付けなくなる確率95%以上(100%ではないところがいやらしい……)の場所で、スクリプトとONScripterの双方を少しずつ修正していき問題を切り分けました。すると、どうやら ONScripterLabel::flush() を多発すると入力を受け付けなくなる確率が高くなるということが判明しました。画面表示を全く行わないと、入力を受け付けなくなることはありません。
    ONScripterLabel::flush を呼び出すと、以下の関数が順に呼び出されて SDL_QWin::repaintRect で Frame Buffer に直接描画されます。つまり、この時の Frame Buffer アクセスが何か悪いことを引き起こしているようです。
    ONScripterLabel::flush()
      SDL_UpdateRect()
        QT_NormalUpdate()
          SDL_QWin::repaintRect(const QRect& rect)
    
  3. ここでは QDirectPainter で直接 Frame Buffer にアクセスしているのですが、Web で QDirectPainter の使用例を探したところ以下の例が見つかりました。
    1. 関数スコープ内でスタックに実体を生成しFrame Buffer Driver をロック
    2. Frame Buffer に操作
    3. スコープから抜けるときにデコンストラクタを呼ばせてロックを解除
  4. ところが、SDL_QWin では以下のようにしています。
    1. new で確保
    2. Frame Buffer に操作
    3. QDirectPainter::end()(実際はQPainter::end())を呼んだ後 delete で解放
    ここで試しに、end() を呼ばないようにしたところ、入力を受け付けなくなることはいっさい無くなりました。この end() は、QDirectPainter の親クラスである QPainter のデコンストラクタでも呼ばれる機会があり、それ以前に呼ばれていなければそこで呼び出されます。つまり、~ QDirectPainter() で終了処理をする前に、親クラスの end() で親クラスの終了処理をしているため、~QDirectPainter() の終了処理がうまくいっていなかったようです。
  5. また、公開されている qtopia-free-1.5.0 を自分でコンパイルし、libqte.so.2.3.2, libqpe.so.1.5.0 を作って、ONScripter をこれとリンクさせて走らせてみました。しかし、C700 ではプログラム自体は動くのですが、起動時に Protocol error 等の表示が出る上、そもそもアプリケーションがイベントをもらえないようでうまくいきません。というわけで、C700用のソースが公開されるまでは Qt/E のソースを直接いじることはできそうにありません。

文字列スプライトの描画で一文字ずつ flush していたのを、文字列全体で一回 flush するように変更しました。

いつのまにか SL-5500 で Home が効くようになっていてびっくりしました。