ONScripter 開発日誌

Since: Feb. 6, 2002
Last updated: Dec. 31, 2010

2010年

12月31日

fu さんからのバグ報告「select命令でのバグ」に対する修正(20101229)が不完全で、セーブファイルを読み込んだ直後に古いテキストが表示されてしまうバグがあったため、修正しました。

いつの間にか select で入力待ちの時にセーブファイルを読み込むと落ちてしまうようになっていたため、修正しました。

12月30日

littlebusterd さんからのバグ報告「A-81Eにて、バグ?」を元に、クリックにて画面効果をスキップ(瞬間表示)した時に、次の文章からは通常通り表示しなければいけないところを、次のクリック待ちもしくは改行まで文章が瞬間表示になっていたバグを修正しました。

12月29日

fu さんからのバグ報告「select命令でのバグ」を元に、クリック待ちの状態から右クリックメニューで"選択肢まで進む"を選ぶと、改行しなければいけない場合でも改行されずに次のテキストが表示されてしまうバグを修正しました。

右クリックメニューを抜けた後などでテキストバッファを復元する際に、禁則処理が正しく行われなかったバグを修正しました。

bokuself さんからのバグ報告「Zaurus で透過 PNG の表示がおかしい。」に関連して、改善されるか分かりませんが、最新のバージョンで Zaurus 版のバイナリパッケージを作成しました。これに伴い、ライブラリパッケージも一部のライブラリのバージョンを更新(SDL_image-1.2.10, SDL_mixer-1.2.11, libpng-1.4.5)しました。ベースが7年も前の SDL-1.2.5 であるにも関わらず、他のライブラリや ONScripter を最新のものにしても問題なく動作するところが素晴らしいです。

12月25日

fu さんからのバグ報告「select命令でのバグ」を元に、select でユーザ入力待ち中に右クリック処理で"選択肢まで進む"を選ぶと、ユーザ入力待ちに戻らずに次の選択肢まで進んでしまうバグを修正しました。

Android版において起動時にゲームフォルダに default.ttf がない場合に、強制終了するのではなく、警告を表示して続行するようにしました。

12月10日

再描画領域を保持する DirtyRect において、領域を追加するときにスクリーン領域外をクリッピングするようにしました。

12月3日

Android 用バイナリパッケージにおいて、音楽ファイル(MP3, Oggなど)のサンプリング周波数がデバイスのサンプリング周波数(22050Hz)の倍数ではない場合に、周波数変換がうまくいかず落ちてしまうことがあるバグを回避ました。厳密な周波数変換は行わず、例えばファイルのサンプリング周波数が48000Hzの場合は48000/22100の商(=2)を計算して周波数を2分の1にします。そのため、この場合は1割ほど遅く再生されてしまいますが、落ちるよりはましだと思ってください。これが気になる方は、自身で変換するなどして事前に音楽ファイルのサンプリング周波数を44100Hzか22050Hzにそろえてください。

11月27日

vbkaisetsu さんからのご提案「システムフォントの自動取得機能案」を元に、Unix 系の環境において、フォントが指定されず default.ttf も存在しない場合に、fontconfig を使ってフォントを自動取得するようにしました。ただし、フォント名を決め打ちにしたくはないため、monospace フォントを探してくるように設定しています。そのため、必ずしも日本語フォントが見つかるとは限らないと思います。以下のように FC_LANG を"ja"に設定すればよいようなので、20101127 をそのように変更しました。USE_FONTCONFIG を定義すると有効になります。Makefile.Linux ではデフォルトで定義してあります。

  FcPatternAddString( pat, FC_LANG, (const FcChar8*)"ja" );

Debian の公式パッケージを管理していただいている Paul さんからのバグ報告「Regression from 20101023 → 20101024」を元に、20101024 で導入した画像再読み込みの抑制に関するバグを修正しました。これまでは、マスク画像だけが変更された場合に再読み込みがされませんでした。

11月18日

greenriverlight101 さんからのバグ報告「FifteenHoundsが強制終了」を元に、movie で引数の stop が正しく解釈されないバグを修正し(ただしエラーにならないだけで未サポートです)、trap で stop, resume をサポートしました。また、r_trap を実装しました。

10月24日

lsp 等でスプライト画像を設定する際に、既に同じスプライト番号で同じ画像を読み込んでいる場合は、読み込み処理を飛ばすようにしました。スプライト以外でも、立ち絵など AnimationInfo 構造体を使用する全ての画像で同様に処理します。ゲームによっては、2回目以降の画像の再読み込み処理が無くなる分高速化されると思います。

10月23日

[Backport] ONScripter-ENを参考に、ボタン選択待ちのときにボタンが正しく表示されないことがあるバグを修正しました。あるボタンを選択してから同じボタン選択待ちに戻ってきたときに、マウスカーソルが外れているにも関わらず、選択したボタンが未選択表示にならないことがありました。だいぶ前から気にはなっていたのですが、ようやく解決です。

btntime で設定する btnwait の待ち時間が、btnwait 後に0に初期化されるバグを修正しました。また、bendef で待ち時間を0に初期化するようにしました。

10月3日

kuzu2_11 さんからのバグ報告「Samsung Galaxy S froyo での動作」を元に、Android 版のパッケージにおいて、起動時にゲームを選択する方法を変更しました。

初期ディレクトリとして、まず SD カードのマウント場所の直下の ons ディレクトリ

Environment.getExternalStorageDirectory()+"/ons"
  (例えば /sdcard/ons)

を見に行き、これが存在しない場合は SD カードのマウント場所

Environment.getExternalStorageDirectory()
  (例えば /sdcard)

を見に行きます。これも存在しない場合は終了します。

次に、ここから出発して、ゲームの格納されたディレクトリを選択します。選択したディレクトリにゲームのスクリプトファイルがある場合は、そのゲームを開始します。もし無い場合は、選択したディレクトリに移動します。親ディレクトリにも移動できます。

このようにした経緯ですが、SD カードのマウント場所を返す関数 Environment.getExternalStorageDirectory() は、機種によって外部 SD カードのマウント場所を返す場合と内部 SD カードのマウント場所を返す場合があります。しかし、内部 SD カードのマウント場所を返す場合には、通常ゲームの格納に使用する外部 SD カードのマウント場所は機種依存となるため、あらかじめ分かりません。そのため、ユーザがディレクトリを探して選択できるようにしました。

20100918 で、ONScripter 独自の英語モード(行頭文字 `)は無くなりましたと書きましたが、ONScripter-EN ではこのモードを利用して英語スクリプトを書いているそうなので、ONScripter でも残すことにして、削除したコードを戻しました。ただし、英語スクリプトに関しては、ONScripter-EN の方が機能拡張されてはるかに書きやすくなっているようなので、英語スクリプトを書く場合は ONScripter-EN を使った方がいいと思います。

9月19日

[Backport] ONScripter-ENより setkinsoku, addkinsoku を取り入れさせていただきました。また、行頭禁則文字と行末禁則文字を分けて正しく扱うようにしました。

9月18日

english を実装しました。define 節で english を実行すると、文中で行頭文字が > の場合に以降の半角文字を例外文字を除いてそのまま表示します。例外文字は、【@】クリック待ち、【\】改ページ待ち、【/】直後の改行を無視、の3特殊文字です。本家では「【/】直後の改行を無視」は例外扱いされていませんが、この機能を使わないと、例えば文中で文字色を変える(下記のスクリプト参照)といったことができなくなり、英語ノベルが書きづらくなると思われるので、ONScripter では例外扱いとします。english はあまりテストしていません。問題があったらご連絡ください。また、これに伴い ONScripter 独自の英語モード(行頭文字 `)は無くなりました。

*define
english
game

*start
>Hello Wonderful /
#ff0000/
>World@

[Backport] ONScripter-ENより breakup.dll のエミュレーションコードを取り入れさせていただきました。

[Backport] ONScripter-ENよりスキップモードの際に画面効果の時間を短縮するコードを取り入れさせていただきました。

8月13日

fu さんからのバグ報告「アニメーション関係のバグ」を元に、画面効果実行中にスプライトのアニメーションが(不正確に)実行されるバグと、画面効果を左クリックで中断できないバグを修正しました。

20100813a

quakex において、ずれた画面の余白が黒く描画されるようにしました。

8月8日

秋月かたねさんからのご提案「loadImageにおける無駄なSDL_ConvertSurfaceの除去の提案」を取り入れ、SDL_image によって読み込まれた画像の SDL_Surface のフォーマットが ONScripter で使用するフォーマットと一致していた場合には、フォーマット変換を行わないようにしました。

nodaguti さんからのバグ報告「アニメーションタグのバグ」を元に、アニメーションタグのコマごとの表示時間が指定どおりに反映されないバグを修正しました。

herbas さんからのバグ報告「禁則処理時のindentの挙動」を元に、禁則処理後の indent 処理のバグを修正しました。

7月11日

herbas さんからのバグ報告「getsavestrで文字列を取得できなくなる不具合」を元に、getsavestr でセーブファイル末尾に格納されている文字列を正しく取得できないバグを修正しました。

秋月かたねさんからのバグ報告「iconvの引数のコンパイルエラー(2)」を参考に、iconv を使わずに UTF-8 への変換を自前で実装することにしました。実は、UTF-16 から UTF-8 への変換は簡単に計算できます(UCSとUTF参照)。また、ONScripter では、SDL_ttf を利用して文字描画を行うために、SJIS から UTF-16 への変換を変換表を使って自前で行っていました。そこで、今回、SJIS から UTF-8 への変換を、SJIS → 変換表 → UTF-16 → 計算 → UTF-8 として実現することにしました。もはや iconv は必要ありません。

秋月かたねさんからのバグ報告「Android上での日本語ファイル名」を元に、Android 版においてファイルシステムの文字コードを UTF-8 として扱うように修正しました。

Android 版において、右クリック(ESC キー)に対応するソフトウェアボタンを追加しました。また、ボタンの場所が分かりやすいようにボタンの中央に文字を表示するようにしました。

20100711a

秋月かたねさんからのバグ報告「iconvの引数のコンパイルエラー(2)」に関して、tmkk さんよりパッチをいただいたので、これを参考に修正しました。Big Endian な環境ではこのパッチでうまく動くようになるそうですが、Endian に関係なくこのパッチは必要になるはずです。Android でしか試していませんでしたが、調べてみたところ、Android では以下のように符合拡張されず暗黙的に src_buf を unsigned char* でキャストしてから代入するような挙動になります。Little Endian な環境の gcc-4.4.4 on Linux (x86) だと符合拡張してから代入されます。

char src_buf[] = {0x80};
unsigned short index = *src_buf++;
Android: index is 0x80
Linux: index is 0xff80

今回の修正では、以下のように明示的にキャストして、どの環境でも同じ結果になるようにしました。

char src_buf[] = {0x80};
unsigned short index = *(unsigned char*)src_buf++;
index is always 0x80

秋月かたねさんに補足していただきました。x86 では char 型は signed char 型ですが、Android に限らず ARM の gcc では char 型は unsigned char 型になるそうです。知りませんでした。これですっきりしました。

7月5日

kuze2_11 さんからのバグ報告「Samsung Galaxy Sでの動作」の続きですが、Galaxy S で Environment.getExternalStorageDirectory() を実行しても、外部ストレージのマウント場所(/sdcard/sd)ではなく、内部ストレージのマウント場所(/sdcard)が返ってくるようです。そのため、対症療法的な対応ですが、以下の場所を順に探すことにしました。

Environment.getExternalStorageDirectory() + "/ons"
Environment.getExternalStorageDirectory() + "/sd/ons"

7月4日

SDL port for Android SDK/NDK 1.6からダウンロードできる Alien Blaster(SDL を使用したゲーム)の最新のソース一式のうち GLSurfaceView_SDL.java と Audio.java の変更を反映させ、Android 版のパッケージを更新しました。これまでは、Android 2.1 から抽出した GLSurfaceView.java を元に GLSurcaceView_SDL.java を作成していたのですが、今回は Android 1.6 から抽出した GLSurfaceView.java を元に GLSurfaceView_SDL.java を作成しているようです。今回更新したパッケージは、手元の HTC Desire (Android 2.1) では動いています。Alien Blaster は秋月かたねさんのところでも動いているようですので、おそらく Xperia(Android 1.6) でも動くのではないでしょうか。

Xperiaでの不動作報告」にて、秋月かたねさんより Xperia で動作したとのご報告をいただきました。これで一安心です。

6月26日

kuze2_11 さんからのバグ報告「Samsung Galaxy Sでの動作」を元に、Android 版において、SD カードがマウントされている場所を /sdcard と決め打ちするのではなく、以下の命令を使って取得するように変更しました。

File file = Environment.getExternalStorageDirectory();

6月25日

MP3, Ogg Vorbis を自前で再生する方式から SDL_mixer で再生する方式に変更しました。これに伴い、MadWrapper によって SMPEG の代わりに MAD で MP3 を再生する機能は削除しました。Linux のディストリビューションなどで配布されている SDL_mixer は SMPEG で MP3 を再生するようになっている場合が多いと思いますが、MAD で再生したい場合は MAD を有効にして SDL_mixer を作り直してください。ちなみに、MadWrapper は SDL_mixer に MP3 再生機能がまだ無かった頃に作ったものです。また、外部コマンドによる MP3 再生機能も、需要がなさそうなので削除しました。

Android 版において MAD を有効にして SDL_mixer をコンパイルするようにしました。

6月20日

Uncle Mion さんからいただいたパッチを元に、AnimationInfo::blendOnSurface2() のクリッピング処理をジャギーが少なくなるように改善しました。

6月18日

fu さんからのバグ報告「setwindow全般の不具合」を元に、拡張スプライトを描画する際のクリッピング処理のバグを修正しました。また、setwindow でウィンドウ色味を #ffffff に設定したときに、完全な透過にならないバグを修正しました。

20100618a

Android 版において PDA_AUTOSIZE を指定してコンパイルすることにより、解像度の自動調整に対応しました。また、PDA_AUTOSIZE 指定時に、解像度を取得する SDL_ListModes() の第2引数に SDL_FULLSCREEN を指定するようにしました。これで、デバイスの解像度が正しく取得されるはずです。

6月17日

Android 版において、ディスプレイ(HTC Desire の場合は 800x480)上でゲーム画面(640x480)外右側の表示がおかしくなる問題を解決しました。Android 版に限り SDL_SetVideoMode() の幅と高さを 0, 0 として、ディスプレイ全体をカバーするようにしました。また、この右側の余白(黒い領域)の上半分をタップするとスキップを on/off し、下半分をタップすると1ページ表示を on/off するようにしました。

6月16日

Android 版においてタスク切り替えに対応しました。HOME ボタンを押すと実行がバックグラウンドに移り、他のアプリケーションが起動できます。この状態でもう一度 ONScripter のアイコンをタップすると再開します。バックグラウンドでは画面描画処理がロックされるので、オートモードにしていても進行しません。ただし、音楽は再生されます。

6月15日

Android 版において、BACK ボタンを押しながら MENU ボタンを押すと SDL_QUIT を発行して終了するようにしました。これまでは間違って実装しており、機能していませんでした。

Android 版において、秋月かたねさんのソースを参考に、本体のボリュームキーでボリュームが変更できるようにしました。

6月11日

fu さんからいただいたバグ報告に基づき、通常スプライトの透過度の情報がセーブファイルに保存されないバグを修正しました。

Android 版にSDL port for Android SDK/NDK 1.6の音声再生の高速化に関する更新(スレッド切り替えを伴わない実装)を取り込みました。Android 1.6 (の実機?)で画面が描画されない問題は認識されているようなので、そのうち修正されることを期待しています。こちらでも一応 Android 1.6 と Android 2.1 の GLSurfaceView.java を見比べ始めました。

6月10日

20100510 の変更の際に、画素ごとにアルファ値が設定された画像を、透過形式をアルファブレンド(a)にして読み込むと、透過処理が行われないバグが発生していたため、修正しました。

6月9日

notifの落とし穴によると、notif は論理演算子で区切った式ごとに真偽を反転させる命令だそうです。ONScripter では条件式全体を反転するように実装していたため修正しました。前記のページでも触れているとおり、本家の場合(バグなのか)

notif 偽 | 真 文

が実行されないため、挙動から正しい解釈を導き出すことができませんでした。

6月7日

今回のソースパッケージは Android 版のための微修正です。秋月かたねさんのご指摘に従い、main_android を SDL の流儀に合わせて SDL_main に変更しました。Android 以外の環境では 2010530 と同じです。

Android 版バイナリパッケージでは、秋月かたねさんのソースを元に、起動時にゲームを選択できるようにしました。/sdcard/ons/ 以下にゲームごとにディレクトリを作成すると、この中から選択できます。また、こちらで配布しているバイナリは Xperia では動かないと思います。Xperia 対応については未定です。

6月2日

秋月かたねさんより、昨日配布した Android 版バイナリの SDL では、実機を傾けると上下左右のキーが押されるイベントが発生するとのご指摘をいただきました。どうもありがとうございます。イベントが発生しないようにバイナリ・ソースとも配布物を更新しました。ただし、ファイル名は変わっていません。

Android 1.6 でも動作するように修正しました。Android 2.1 ではうまくいくのですが、Android 1.6 の場合は main 関数をアプリケーション側で定義して呼び出そうとすると失敗するようです。今回、ANDROID が定義されている場合には onscripter.cpp と sdl_main.cpp 内の main を main_android に置換することで解決しました。Android 1.6 以上で動作するバイナリパッケージを公開します。

6月1日

秋月かたねさんに少し遅れましたが、こちらでも Android 2.1 用のバイナリパッケージ(apk)を製作する環境を整えたので、開発環境のソース一式と Android 2.1 用のバイナリパッケージを公開しました。一昨日公開したバイナリはフレームバッファに直接アクセスするため root 権限が無いと動きませんでしたが、今回のバイナリは特別なことをしなくても動作すると思います。また、音声の再生にも対応しています。ただし、エミュレータ上ではだいぶ遅くなってしまいました。

5月30日

Android 版バイナリパッケージの配布を開始しました。SDL のおかげで ESC キーをホームボタンに読み替えた他は全くソースを変更する必要がありませんでした。とは言っても、今は実機が無いため Emulator 上でしか動作確認をしていません。音楽や動画は再生できませんが、その他は一通り遊べると思います。実機での動作報告・不具合報告・要望などよろしくお願いします。

これまでは、低解像度環境において画像を縮小表示すると、透過色を指定していた場合にきれいに縮小できない問題がありました。これは、画像の縮小を「補間縮小」→「透過色のチェック」とやっていたため、補間縮小の際に透過色が周囲の色と混ざってしまい透明画素とみなされなくなることが原因でした。今回、処理を「透過色のチェック(透過色の場合は色も黒に)」→「補間縮小」の順に変更し、きれいに縮小されるようにしました。

もはや Zaurus を使用している方はほとんどいないと思うので、特に要望がなければ、Zaurus 版バイナリパッケージの更新は気が向いたときにしようと思います。

20100530a

vbkaisetsu さんからのバグ報告「AVIWrapperでの暗黙的な型変換」を参考に、AVIWrapper.cpp 内で一部変数の型を変更し、また a_stream->ReadFrames() の引数を明示的にキャストするようにしました。

秋月かたねさんが Xperia を購入され(!) ONScripter を試してくださったようです。こちらで配布している onscripter_20100530_android は残念ながら SDL の初期化に失敗して途中で止まってしまったようですが、実機で動作する日も遠くないと思います。

root 権限が無いと直接 /dev/graphics/fb0 にアクセスすることができないようです。SDL port for Android SDK/NDK 1.6で描画も音声再生もうまくいっているようなので、時間を見つけて試してみたいと思っています。

5月10日

前からやろうとは思っていたのですが、命令の先頭文字('a'-'z')でハッシュテーブルを作成し、対応する関数の検索を高速化しました。これまでは、命令を実行するたびに、全関数のリストを先頭から順に命令名と照合していたので、全般的にかなり高速化されたと思います。

5月9日

[Backport] ONScripter-ENの起動時間短縮に関するコードを取り入れさせていただきました。これまでは、アーカイブ内の SPB もしくは NBZ(=bzip2) 圧縮された全ファイルの元ファイル長を知るために、プログラム開始時にアーカイブ内をランダムアクセスし全圧縮ファイルの先頭のデータから元ファイル長を計算していましたが、ランダムなディスクアクセスを伴うため結構時間がかかっていたようです。今回、プログラム開始時には圧縮ファイルの元ファイル長を計算しないことによってランダムアクセスを抑制したため、ゲーム開始までの時間が短くなりました。ディスクアクセスが遅い環境では特に効果があると思います。Mion さん Roto さん、ありがとうございます。

[Backport] NetWalker 版の ONScripter ( Qt 初心者の覚え書き)から、32bit 表示における文字描画の高速化に寄与する修正を一部取り入れさせていただきました。主な変更点は、BLEND_TEXT_ALPHA()(AnimationInfo.cpp) と BLEND_PIXEL_TEXT() (ONScripterLabel_image.cpp)の高速化です。こういった改善はとても思いつかないので、たいへんありがたいです。

3月20日

Uncle Mion さんからいただいたパッチに基づき、ButtonLink::removeSprite() 内の削除スプライト判定処理が間違っていたバグを修正しました。

nodaguti さんからのバグ報告「strspのバグ」を参考に、strsp 実行後にスプライト領域の更新が正しく反映されないバグを修正しました。

1月31日

すとーむさんからのパッチ「if 命令の||」を参考に、if 文における| (or) をサポートしました。ただし、本家と同様 & との混在はできません。

20100131a

| (or) のサポートに関する修正です。しかし、本家では以下の「表示されないはず」が表示されますが、表示されないのが正しい挙動である気がします。ONScripter ではさしあたり表示されないようになっています。

*define
game
*start
mov %0, 10
mov %1, 11
notif %0=10 | %1=1 puttext "表示されないはず"
\
end

1月17日

Web のデザインを変更しました(以前のデザイン)。FireFox 3.5.7 と IE7 でしか確認していないため、もし他のブラウザなどでレイアウトがくずれるということがあったらご連絡いただけるとありがたいです。

1月16日

[Backport] NetWalker 版の ONScripter ( Qt 初心者の覚え書き)から、描画処理の高速化に寄与する修正を一部取り入れさせていただきました。主な変更点は、アルファブレンドの高速化、乗除算の除去、ループカウントの増加型から減少型への変更です。

こういった自分では思いつかない改善方法が得られると、オープンソースにしてよかったと思います。有意義な修正は取り入れていきますので、独自に修正されている方はぜひソース(差分)を公開していただければと思います。なお現在は、後々の保守が大変なインラインアセンブラはなるべく導入しない方向で考えています。

また、拡張スプライト(lsp2 など)においてセグメンテーションフォルトすることがあるバグ(AnimationInfo::blendOnSurface2() 内)を修正しています。

20100116a

すとーむさんからの修正ファイル「forPSP 用の修正」を取り入れ、PSP 版において終了時にグローバル変数や既読情報などを保存するようにしました。PSP 版以外には影響はありません。

1月3日

develop_useless_wisdom さんからのバグ報告「[うみねこのなく頃にEpisode1]にて特定のBGMが再生されない不具合」を元に、Shift jis でエンコードされたファイル名の中の2バイトコードの2バイト目がディレクトリ区切り文字'\'(0x5c)であった場合に、ファイル名がただしく扱われなかったバグを修正しました。

Eugene さんからの報告に基づき、XM や MOD ファイルを演奏できるようにしました。play で演奏できます。

drawsp2 や drawbg2 で呼ばれる描画ルーチン AnimationInfo::blendOnSurface2() の最も内側のループから整数演算の除算を削除しました。こちらの環境では、この部分の描画処理速度が1割程速くなりました。

20100103a

[Backport] ONScripter-ENの描画関連のコード(ONScripterLabel::alphaBlend(), ONScripterLabel::alphaBlendText(),AnimationInfo::blendOnSurface(), AnimationInfo::blendOnSurface2(),AnimationInfo::blendText())の一部を取り込みました。未検証ですが、描画速度が若干速くなっていると思います。