2011年

12月26日

バグ報告「解像度について」を元に、スクリプト先頭の ;$ による設定を読み込む部分のバグを修正しました。

strsph 命令を実装しました。

12月25日

スクリプト先頭の ;$ による設定に対応しました。これにより任意の解像度を設定できるようになったため、--wide オプションは廃止しました。

Android 版でも任意の解像度を設定できます。Android 版の場合は、スクリプトで指定された任意の解像度が、アスペクト比を保ったままデバイスの実画面を最大限使って表示されるように ONScripter 側で自動的に拡大・縮小されます。ボタンは、もし余白(右側か下側)があればそこに表示されます。

12月22日

バグ報告「Regression: English mode not working after 20111218」を元に、20111218 に修正ミスがあり、ENABLE_1BYTE_CHAR を指定したときに、英語モードで表示がおかしくなるバグを修正しました。

12月19日

バグ報告「strsp・logsp2についてと要望」を元に、20111218 に修正ミスがあり、主に文字列スプライトで、偶数番目に半角スペースが来てその直後に文字列が終了する場合に表示がおかしくなるバグが生じており、これを修正しました。

12月18日

バグ報告「strsp・logsp2についてと要望」を元に、strsp, logsp, logsp2 命令の表示位置がずれるバグを修正しました。また、getcursorpos2, kinsoku 命令を実装しました。

先頭が半角文字であっても、常に 2byte ずつ文字を描画するように変更しました。

12月17日

バグ報告「saveoffのロード」を元に、saveoff 命令を実行したときに実行状態をメモリに保存し、savegame 命令か右クリックメニューからの保存でそれをファイルに出力するようにしました。saveon の状態では、本来は全命令の先頭で実行状態を保存しなければいけないようですが、この場合実行速度がかなり遅くなってしまうのであえてやりません。今回ご報告いただいた場合を含め、たいていの場合には今回の修正で同じ挙動になると思います。もし不具合があればご連絡下さい。

11月10日

MP3 形式の音楽をループなしで再生し、フェードアウトを有効にして停止しようとするときに、フェードアウト中に音楽の最後まで到達すると処理が無限ループに陥ってしまうバグを修正しました。

11月2日

Android 版において、ボタン表示の有無および画面の表示位置の情報を保存するようにしました。アプリを終了してから再び実行したときに設定が引き継がれます。

10月25日

バグ報告「exbtn_dについて」を元に、btnwait を実行した直後に exbtn_d の指定が反映されないことがあるバグを修正しました。

エミュレータ上での確認ですが、Android 4.0 でも問題なく動作しています。

10月22日

フェードアウトを有効にした状態で Ogg Vorbis 形式の音楽を停止し、直後に音楽を再生したときに、新たに再生した音楽がすぐに停止してしまうことがあるバグを修正しました。

10月12日

バグ報告「「海洋レストラン☆海猫亭」動作中の操作にて」を元に、trap 命令が stop の状態でクリックもしくはスペース・リターンキーが押されたときに、resume 後に指定されたラベルにジャンプされないバグを修正しました。

バグ報告「bgmfadein/fadeoutについて」を元に、mp3fadeout, bgmfadeout でフェードアウト時間を変更したときに、現在フェードアウト中の音楽は影響を受けないようにしました。

10月11日

バグ報告「bgmfadein/fadeoutについて」を元に、Ogg Vorbis 形式の音楽ファイルを再生するときのフェードイン・フェードアウトは、フェード開始後終了を待たずに次の命令に進むようにしました。本家では、Ogg Vorbis 形式の場合は終了を待たず、MP3 形式の場合は終了を待つようになっているため、これにならいました。20111010 では MP3 形式でしかチェックしていなかったため、常に終了を待つようになっていました。

10月10日

[Backport] ONScripter-ENを参考に mp3fadein, mp3fadeout, bgmfadein, bgmfadeout を実装しました。

10月9日

文字列スプライトで、ルビが有効な時にルビ一行分小さく画像を確保していたバグを修正しました。

automode 実行時に画面効果が瞬間表示になってしまうバグを修正しました。

10月8日

バグ報告「ムーンライトバスケットが動かない」と「「ムーンライトバスケット」操作不可」に関連して、新画像ボタン用の bclear, bcursor, bdef, bdown, bexec, bsp, btime, btrans を実装しました。

10月7日

追加機能要望「ns2アーカイブへの対応」に関連して、ns2 アーカイブの読み込みルーチンのバグを修正しました。また、もし ns2 アーカイブが存在する場合は必ず読み込むようにしました。

バグ報告「「海洋レストラン☆海猫亭」動作不可」を元に、文字列スプライトの指定が正しく解釈されない場合があったため修正しました。

9月27日

BTS で突然以下のようなエラーが表示されるようになりました。

Following errors occurred. Please contact administrator.

undefined method `to_time' for #<DateTime: 10604607289/4320,0,2299161>
(NoMethodError)

影舞の BTSによると、dbi が新しいと発生するようです。以下のパッチが置いてあったので適用したところ解決しました。おそらく sourceforge.jp 側でプログラムが更新されたことが原因だと思います。

--- dbistore3.rb	(リビジョン 603)
+++ dbistore3.rb	(作業コピー)
@@ -26,6 +26,12 @@
 require 'kagemai/searchcond'
 require 'kagemai/dbiutil'
 
+class DateTime
+  def to_time
+    Time.local(year(), month(), day(), hour(), min(), sec())
+  end
+end
+
 module Kagemai  
   module BaseDBIStore3

9月25日

Uncle Mion さんより、大文字と小文字が区別されないファイルシステムでは ONScripter.cpp と onscripter.cpp が同時に存在できないというご指摘をいただいたので、onscripter.cpp を onscripter_main.cpp に変更しました。

追加機能要望「IS01での動画再生」を元に、Android 版において動画ファイルを再生する際に動画ファイルが存在するか調べ、存在しない場合には動画再生アプリを呼び出さないようにしました。

9月24日

クラス名を ONScripterLabel から ONScripter に変更(置換)しました。これに伴いファイル名も変更になっています。開発初期にはQt(当時は trolltech 社の製品)の QLabel を継承して実装していたため名前を ONScripterLabel にしました。その後、音楽や画像のサポートが充実しているSDLを代わりに使うようになりましたが、クラス名はついそのままにしていました。今になって変更することでご迷惑をおかけしてしまう方もいらっしゃるかと思いますが、以前から気になっていたことでもありこの際変更させていただきます。

セーブファイルをロード中にクリックもしくはタップを連打すると、読み込み中にイベントキューがあふれてしまい、必要なイベントを追加できずにフリーズしてしまうことがありました。対症療法ですが、ロード後にキューにたまったイベントを消去するようにしました。

HTC Desire の OS を 2.3.3 にアップデートしました。てっきり OTA で配布されるものと思っていましたが、HTCDevの Kernel Source Code からプログラムをダウンロードして実行する必要がありました。2.2 と比べて ONScripter の動作が体感できるくらい速くなりました。

9月23日

セーブファイルの読み込み関数にバグがあり、まれにセグメンテーションフォルトを引き起こすことがありました。beta-20030811 でセーブファイルを本家と互換性のある形式に変更して以来ずっと残っていたバグでした。また、もはや必要ないと思うので bete-20030811 以前の独自セーブファイル形式のサポートを終了しました。

セーブファイルには解像度変換前の座標関連値を保存していますが、セーブとロードを繰り返すと値が変化する場合があるバグを修正しました。

yesnobox を解釈するようにしました。ただし、常にイエスであるとみなして変数に 1 をセットします。

[Backport] 追加機能要望「ns2アーカイブへの対応」を実現するため、ONScripter-ENを参考に ns2 アーカイブの読み込みに対応しました。

9月19日

btndown 1 の時に、マウスボタンを押した瞬間のみボタン押下処理をするのではなく、押したままマウスを動かした場合でも押下処理をするようにしました。本家では、マウスボタンを押した状態ではマウスを動かさなくともイベントが連続して発生し押下処理をするようですが、これへの対応は保留にします。これを使うと、ドラッグして画面をスクロールするインターフェースが作成できます。

strsp でルビが表示されるようにしました。

9月18日

spbtn, exbtn の時点でボタン画像を可視化するのではなく、btnwait の時点で可視化するように修正しました。

textgosub や pretextgosub 回りの挙動がおかしくなっていたので修正しました。

Android 3.x で HOME ボタンを押すとそこからうまく復帰しなかったようなので、復帰時に onStop() を経由したかどうかを調べ、経由していない場合にのみサーフェスを再構成するように修正しました(下記)。実機の Android 2.2、およびエミュレータの Andorid 3.2 で試しましたが HOME を押しても電源ボタンを押しても正常に復帰します。エミュレータの Android 1.6 では、HOME からは復帰しますが、電源ボタンはそもそも押しても反応しないようなので実機でどうなるかは分かりません。

GLSurfaceView_SDL.java:
    class GLThread extends Thread implements SwapBuffersCallback {
...
        public void onResume()
        {
            synchronized (this){
                mWidth = 0;
                mHeight = 0;
                mPaused = false;
                notify();
            }
            if (mStopped == false){ // e.g. resume from power button
                surfaceCreated();
                onWindowResize(mWidthBack, mHeightBack);
            }
        }

9月10日

textspeeddefault を実装しました。

グラフィックファイル指定において、">幅,高さ,#色"で長方形を設定したときに、a(アルファブレンド)指定が正しく処理されないバグを修正しました。

getcursorpos において、文字位置がテキストウィンドウの右端にあるときに、カーソル位置が次行の先頭に来ないでそのまま右にはみ出してしまうバグを修正しました。

BTS で突然以下のようなエラーが出てページが表示されなくなりました。

Following errors occurred. Please contact administrator.
undefined method `[]=' for nil:NilClass (NoMethodError)

以下のように guest.cgi のデバッグ出力を有効にして実行すると、

$DEBUG = 1
$SHOW_ENV_VARS = true # debug
$KAGEMAI_DEBUG = true # debug

以下のような出力が出ました。

kagemai/lib/kagemai/cache_manager.rb:69:in `save_cache'
/usr/lib/ruby/1.8/pstore.rb:322:in `transaction'
/usr/lib/ruby/1.8/pstore.rb:321:in `catch'
/usr/lib/ruby/1.8/pstore.rb:321:in `transaction'
kagemai/lib/kagemai/cache_manager.rb:68:in `save_cache'
kagemai/lib/kagemai/project.rb:431:in `save_cache'
kagemai/lib/kagemai/kagemai.rb:92:in `action'
cgi-bin/kagemai/guest.cgi:65:in `execute'
cgi-bin/kagemai/guest.cgi:113

結局、以下のファイルを削除したら直りました。

kagemai/project/onscripter/cache/cache.pstore

allsphide で立ち絵も消すようにしました。

9月4日

mp3(bgm) 使用時に、ある種の WAVE ファイルは Mix_LoadMUS_RW() を使ったストリーミング再生に失敗するので、失敗したときには Mix_LoadWAV_RW() によって一度全部メモリ上に読み込んでから再生するようにしました。この場合再生されるまで若干待たされますが、再生されないよりはましだと思います。

本家との互換性向上のため細かい個所を修正しました。

8月30日

おそらくボタンの表示・非表示の切り替えに対応した頃から、手元の Android 2.2 では問題ありませんが、Android 1.6 だとゲームを選択した後に落ちてしまうようです。Emulator で実行すると、ログに以下の情報が残っていました。

W/dalvikvm(  294): threadid=3: thread exiting with uncaught exception
E/AndroidRuntime(  294): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime(  294): java.lang.RuntimeException: mBaselineAlignedChildIndex of LinearLayout set to an index that is out of bounds.

調べたところ、Android 1.6 で LinearLayout を子要素なしで表示すると上の例外を出して落ちてしまうようです。そこで、ダミーの非表示ボタンを子要素として追加するようにしました。これで Android 1.6 でも遊べるようになったと思います。

また、Android 版のバージョンが 20110828 となっていましたが、20110827 の間違いでした。今回の更新でファイル名は 20110827-1 になります。

8月28日

Android 版において、電源ボタンを押した後に正しく復帰するようにしました。1年前からの懸案がようやく解決しました。修正点は以下のとおりです。

  1. 電源ボタンが押されると、通常は画面の向きが変更されるため、Activity を再構築するために onDestroy() が呼ばれますが、以下のようにしてこれを回避しました。
    この方法はSonscripterの開発者の方に教えていただいたのですが、これで終了することは無くなったものの、復帰後に画面の描画が更新されなくなるという問題がありました。ちなみに、この状態から HOME ボタンで処理をバックグラウンドに移し、アイコンをタップして復帰すると正常に戻ります。
    onscripter_android/AndroidManifest.xml:
    android:configChanges="orientation|keyboardHidden"
    
  2. HOME ボタンを押して復帰すると、onPause() → onStop() → onStart() → onResume() が呼ばれ、その過程でサーフェスが破棄・生成されます。しかし、電源ボタンを押した場合は onPause() → onResume() が呼ばれるためサーフェスが古いままになっていました。そこで、onPause() と onResume() で GLSurfaceView_SDL のサーフェスを明示的に破棄・生成するようにしました。
    こんなことをしてよいのか分かりませんが、手元では問題なく動いています。
    onscripter_android/src/Video.java:
    	@Override
    	public void onPause() {
    		nativeKey( 0, 3 ); // send SDL_ACTIVEEVENT
    		super.onPause();
    		surfaceDestroyed(this.getHolder());
    	}
    
    	@Override
    	public void onResume() {
    		nativeKey( 0, 3 ); // send SDL_ACTIVEEVENT
    		super.onResume();
    		surfaceCreated(this.getHolder());
    		surfaceChanged(this.getHolder(), 0, mRenderer.mWidth, mRenderer.mHeight);
    	}
    
  3. wake lock を生成するときになぜか PowerManager.ON_AFTER_RELEASE を指定していたため、電源ボタンを押すと onPause() の直後に onRelease() が呼ばれていました。そのため、画面がオフにならず、また音楽も再生され続けていました。以下のように wake lock を作成することによって、電源ボタンを押すと画面がオフになりかつ音楽の音量が0になるようになりました。なお、もう一度電源ボタンを押すと正しくゲームに復帰します。
    onscripter_android/src/ONScripter.java:
    	wakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "ONScripter");
    

8月27日

Android 版において、起動した後に1回余計にビデオを再設定することがあり、その際に画面がちらつくことがある問題を修正しました。これに伴い ONScripter 本体も修正していますが、Android 以外のプラットホームには無関係の修正です。

Android 版の専用アプリを作成する場合に、今まではゲームデータを初回にダウンロードする必要がありましたが、ゲームデータを内蔵したアプリも作成できるようにしました。assets フォルダにゲームの構成ファイルを配置してアプリを作成し、インストール後の初回起動時に SD カードにコピーします。

ところで、Android 2.2 以前では、assets フォルダにある 1MB 以上のファイルを圧縮して apk に含める、プログラムから読み込む際に失敗してしまいます。これを回避するには、ant の設定ファイル (main_rules.xml) の中で <nocompress /> を有効にします。こうすると、assets フォルダ内のファイルを圧縮しないで apk が作成され、大きなファイルでも問題なく読み込んでコピーすることができるようになります。

8月25日

Android 版において、ボタンとメニューの日本語表示に対応しました。日本語環境では日本語に、その他の環境では英語表示になります。また、ボタンメニューの内容を変更し、「上」「下」ボタンで前後の選択ボタンに移動できるようにしました。画面が小さくてボタンが押しづらい場合に利用してください。

8月20日

Windows での Android 版アプリの開発方法の手順をまとめました。

また、これまでは Linux で開発しておりその際はうまくいっていたのですが、今回 Windows でコンパイルに失敗する個所が見つかったため、SDK (onscripter_android.tar.gz) を修正しました。以下のように Android.mk でヘッダファイルを探索する場所を LOCAL_C_INCLUDES を使って指定しないといけないようです。

LOCAL_C_INCLUDES := $(LOCAL_PATH)/include

LOCAL_CFLAGS := $(LOCAL_C_INCLUDES:%=-I%) \
	-DSDL_JAVA_PACKAGE_PATH=$(SDL_JAVA_PACKAGE_PATH) \
	-DSDL_CURDIR_PATH=\"$(SDL_CURDIR_PATH)\" \
	-DSDL_TRACKBALL_KEYUP_DELAY=$(SDL_TRACKBALL_KEYUP_DELAY)

8月19日

transbtn を実行して btnwait でボタンをクリックした際に、候補となるボタンが複数ある場合はその場所で最も透過度が低い(不透明な)ボタンを選択するようにしました。

btntime で 0 を指定したときに、btnwait で待ち時間が 0 にならないバグを修正しました。

8月17日

Android 版において、MENU ボタンを押すとメニューが出るようにしました。これに伴い、右クリックを MENU ボタンで代用する機能と BACK ボタンを押しながら MENU ボタンを押すと終了する機能は無くなりました。

8月16日

Android 版において、初回にダウンロードするゲームデータ(zip ファイル)の暗号化に対応しました。暗号方式は WinZip の 256-bit AES のみをサポートしています。パスワードはパッケージ(apk)に埋め込みます。暗号化手順についてはゲームデータの初回ダウンロード機能を参照してください。これで有料アプリケーションを開発しやすくなったと思います。

8月15日

画像を読み込む際のアルファ値の設定方法にバグがあり画像データが正しく読み込まれないことがあるバグを修正しました。

getscreenshot の中で画像をリサイズせずに、savescreenshot の中でリサイズするようにしました。

[Backport] ONScripter-ENを参考に automode_time のデフォルト値を 1000 に変更し、また automode_time の値を envdata に格納するようにしました。

Android 版において、余白が大きい場合にソフトウェアボタンがなるべく正方形になるようにしました。

20110815a

ひしゃまるさんからのバグ報告を元に、スプライトの大きさが意図せず変更されてしまうことがあるバグを修正しました。

ひしゃまるさんからのバグ報告を元に、グラフィックファイル指定において">幅,高さ,#色"で長方形を設定したときに、16bpp モードでは色が正しく設定されないバグを修正しました。

8月13日

Android アプリケーションでは、外部記憶装置(SDカードなど)上の以下の場所にデータを保存するのが流儀のようです。

/Android/data/<package_name>/

これまでは、起動時にゲームを選択しない場合は strings.xml の game_directory でゲームの構成ファイルがある場所を指定していましたが、それをやめて上記の場所に置くように変更しました。また、端末の API Level が 8 以上(Android 2.2 以上)の場合は、ここにあるファイルはアプリケーションのアンインストール時に同時に消去されます。

Android 版のゲームデータの初回ダウンロード機能を改善しました。

  1. zip 内のディレクトリが展開されないバグを修正しました。
  2. BufferedInputStream, BufferedOutputStream を介してファイルの読み書きをするようにしました。ディスクのアクセス速度が遅い場合でも、データを貯めて一度に読み書きするのでゲームデータの展開速度が多少速くなっていると思います。
  3. read/write の間に以下のウェイトを入れることによってプログレスバーの更新頻度を上げ、止まっているように見えることがないようにしました。
    try{
        Thread.sleep(1);
    } catch (InterruptedException e){
    }
    

フォルダに .nomedia というファイルを置くと、そのフォルダより下の階層にある画像や音楽ファイルはギャラリーや音楽プレイヤーの検索対象外になるようです。

8月7日

cutlass さん製作のゲームNOeSIS 体験版がアンドロイドマーケットで公開されました。ONScripter on Androidをゲームエンジンに使っていただいています。今回、ダウンロード機能の追加などで協力させていただきました。おもしろいのでぜひ遊んでください。

8月6日

Android 版において、ゲームデータの初回ダウンロード機能を改善しました。まず、

HttpConnectionParams.setSoTimeout(client.getParams(), 3000);

によってタイムアウトを設定し、タイムアウト後にサーバに再接続することによってダウンロード途中に止まりっぱなしになることを回避しました。また、再接続時に

request.addHeader("Range", "bytes="+downloaded+"-"+totalLen);

によって、(可能なら)タイムアウトした時点からダウンロードを再開するようにしました。また、上の変更に伴い、ダウンロードと展開を同時に行っていたのを、まず zip ファイルをダウンロードし、ダウンロード後に展開するように変更しました。

8月1日

Android 版において、ゲームデータの初回ダウンロード機能を実装しました。この機能を使ってパッケージを作成し、ゲームの構成ファイルを単一の zip ファイルにまとめてウェブサーバ上に置いておくと、初回のみインターネット経由でダウンロードして端末に展開します。

6月19日

バグ報告「お絵かき戦争で落ちる」を元に、getcselstr で、定義されていない選択肢の文字列を取得しようとすると終了してしまうバグを修正しました。定義されていない場合は空文字列を設定するようにしました。

1年前からの懸案ですが、Android 版を実行中に電源ボタンを押すと onPause() -> onStop() -> onDestroy() が呼ばれ、もう一度電源ボタンを押すと onCreate() -> onStart() -> onResume() が呼ばれてゲーム選択画面から再開してしまいます。一方、HOME ボタンを押すと onPause() -> onStop() まで呼ばれ、バックグラウンドで実行を続けます。バックグラウンドから復帰をすると、onRestart() -> onStart() -> onResume() が呼ばれて続行します。電源ボタンを押したときも同じようにしたいのですが、どうしたらよいか分かりません。Winamp は電源ボタンを押しても再生し続けるので、技術的にはできそうですが…。

5月28日

バグ報告「恋するトナカイで勝手にページ送りされる」を元に、texthide 状態でも文字描画直後は文字が表示されるようにしました。根本的には、スクリプト側で texthide 状態のまま textshow をせず進行しているところに問題があり、そのため本家を使っても右クリックメニューから戻ると文章が復帰しません。また、この修正に伴い不必要な描画を削減しているので、全体的な描画速度も向上していると思います。もしかしたら、別の個所で表示がおかしくなっているかもしれないため、その場合はご報告下さい。

Android 版をコンパイルしようとしたら、デバッグキーの有効期限が切れていました。Android 版の開発を始めてからちょうど1年が経過したことになります。~/.android/debug.keystore を削除して再コンパイルしたところ、自動的に新しいデバッグキーが作成されました。デバッグキーが変わったため、パッケージのアップデートはできません。古い ONScripter はいったんアンインストールしてから、新しい ONScripter をインストールしてください。

5月21日

バグトラッキングシステム(影舞)において、バグ報告を個別に XML ファイルで管理する方式から、MySQL で管理する方式に変更しました。個別に管理する方法では、sourceforge.jp の場合、検索条件にも依存しますが、バグ報告数がだいたい 140 を超えたあたりから、検索中にタイムアウトして internal server error になってしまうことが多くなります。「ムーンライトバスケットが動かない」で一度変更を試みましたが、途中で以下のようにエラーになってしまい断念していました。

[]$ ruby bin/convert.rb onscripter Kagemai::MySQLStore3
/usr/lib/ruby/1.8/pstore.rb:354:in `load': undefined class/module Kagemai::ActionResult (ArgumentError)
        from /usr/lib/ruby/1.8/pstore.rb:354:in `load'
        from /usr/lib/ruby/1.8/pstore.rb:310:in `transaction'
        from lib/kagemai/cache_manager.rb:77:in `invalidate_cache'
        from lib/kagemai/project.rb:435:in `invalidate_cache'
        from lib/kagemai/project.rb:178:in `save_config'
        from bin/convert.rb:59:in `convert_store_type'
        from bin/convert.rb:73

今回よく調べてみたところ、実は MySQL のデータベースの作成自体は正常に終了しており、その後のキャッシュの削除で失敗していることが分かりました。そこで、以下のように手動でキャッシュの削除と設定ファイルの変更をしたところ、問題なく移行できているようです。前回の検索数の制限も元に戻しました。これで、BTSの検索と統計が制限なく使えるようになっていると思います。

[]$ rm project/onscripter/cache/*

[]$ vi project/onscripter/config
旧)
@db_manager_class = Kagemai::XMLFiles
新)
@db_manager_class = Kagemai::MySQLStore3

ちなみに、データベースのバックアップと復元は以下のように行います。

[]$ mysqldump -u onscripter -p -h mysql?.sourceforge.jp -B onscripter  | gzip > mysql_onscripter.dump.gz

[]$ gunzip -c mysql_onscripter.dump.gz | mysql -u onscripter -p -h mysql?.sourceforge.jp

5月20日

バグ報告「 transbtnCommandの戻り値がない」を元に、ONScripterLabel::transbtnCommand 関数で戻り値を設定していなかったバグを修正しました。

バグ報告「 人工女神がボタン操作で落ちる」を元に、prnum において、数値ラベル番号が0〜99の範囲を超えている場合に、処理を中断(ゲームは続行)するようにしました。なお prnum は、本家のマニュアルを見ると ver 2.93 以降で非推奨になっています。

4月16日

要望が多いようなので、--wide オプションを指定することによりワイドスクリーンモードに対応するようにしました。ONScripter ではゲーム画面の比率は通常 4:3 に固定されていますが、ワイドスクリーンモードではこの比率が 16:9 になります。ゲーム画面の横幅は、スクリプトから 320, 400, 640, 800 のいずれかに指定できます(デフォルトは 640)。縦幅は上記の比率から決定されます。画像はゲーム画面に合わせて用意してください。

Android 版では、起動時にワイドスクリーンモード(16:9)と通常表示(4:3)を選択できます。実際に表示する際には、デバイスの解像度に合うように ONScripter 側でゲーム画面を伸縮して表示します。

コンパイル時に渡す PDA を廃止しました。デバイス画面の横幅を指定する場合は PDA_WIDTH を、デバイス画面の横幅を自動取得する場合は PDA_AUTOSIZE を指定してください。

バグ報告「 レミュオールの錬金術師で落ちる」を元に、SDL のイベントが立て続けに発生すると、キューに入った ONS_BREAK_EVENT が正しく処理されないバグを修正しました。

ソースを少し修正し、Android 版バイナリも更新しました。ファイル名は同一です。

3月20日

たいていのゲームには無関係ですが、nsa アーカイブ内の nbz 形式のファイルを読み込む際に、復元後のサイズが正しく取得されずセグメンテーションフォルトを引き起こすことがあるバグを修正しました。

今のところ VPlayer は快適です。ただし、独立した動画プレーヤーであるため、ONScripter の画面(左寄せ)からシームレスに動画画面(中央寄せ)に移行できない点が難点ですが。

VPlayer Advanced という動画プレーヤー(VPlayer とは無関係)が出ていたので試してみましたが、ONScripter から使う場合には、同じ動画を再生しようとすると最初からではなく前回中断したところから再生される、画面がスクリーンいっぱいに拡大されるため HTC Desire では横に延びてしまう、といった不具合がありました。

3月11日

Android 版の外部動画プレーヤーとして RockPlayer Lite を使用していましたが、同じ動画を再生しようとすると最初からではなく前回中断したところから再生される、たまにプレーヤーが起動されないことがある、たまに ONScripter の onDestroy() が呼ばれ終了してしまうことがある、など色々不具合がありました。代わりに VPlayer を使ってみたところ、今のところ上記の問題は発生せず快適に使用できています。

Android 版をコンパイルする時のカスタマイズについて記載しました。

3月9日

Android 版において、外部プレーヤーを利用して動画を再生できるようにしました。native C++ の ONScripter からコールバックで ONScripter.java の以下の関数を呼びます。再生できる動画の形式は外部プレーヤーに依存します。外部プレーヤーは何でも構いませんが、当方では対応する形式が多い RockPlayer Lite を使用しています(推奨しているわけではありません)。動画再生中は onPause() が呼ばれるため ONScripter の実行は中断されます。動画再生終了後に onResume() が呼ばれて実行が再開されます。なお、今回のリリースは Android 以外のプラットフォームでは変更点はありません。

public void playVideo(char[] filename){
    try{
        String filename2 = "file:/" + gCurrentDirectoryPath + "/" + new String(filename);
        filename2 = filename2.replace('\\', '/');
        Log.v("ONS", "playVideo: " + filename2);
        Uri uri = Uri.parse(filename2);
        Intent i = new Intent(Intent.ACTION_VIEW);
        i.setDataAndType(uri, "video/*");
        startActivityForResult(i, -1);
    }
    catch(Exception e){
        Log.e("ONS", "playVideo error:  " + e.getClass().getName());
    }
}

3月8日

Android 版において、Widget を使用して画面の右側(もしくは下側)に表示されるボタンを描画するようにしました。これまでは ONScripter 内で文字だけを使ってボタンを描画していたため、見た目がずいぶんよくなったと思います。ONScripter のソースの変更はありません。ボタン描画のコードは次回のリリースで削除します。

Android 版で movie などから動画(MPEG-1)を再生できるようにしたいのですが、よい方法を思いつきません。SMPEG はコンパイルは簡単にできましたが、そのままでは画面がそもそも描画されず、また音声は再生されるものの遅延がひどくて実用になりません。MPEG-4 に変換することを前提に VideoView で再生しようとしましたが、GLSurfaceView.Renderer.onDrawFrame() -> ONScripter (Native C++) -> Handler -> VideoView という経路では再生できませんでした。困りました。

2月26日重大なバグ修正

Android 版でゲームをしていたところ、以前から認識はしていたのですがあまりに頻繁に落ちるので、原因を探ってみました。__android_log_print() を使っていわゆる printf デバッグをした結果、ONScripterLabel::stopBGM() 内に Android 版に限らずセグメンテーションフォルトを引き起こす可能性のあるバグを見つけたため修正しました。音楽再生を開始するタイミングでよく落ちていた問題はこれが原因だと思います。修正後に某ゲームを最初から最後までスキップで流してみましたが一度も落ちませんでした。これでかなり安定したと思います。

2月23日

underline の値をセーブファイルに保存するようにしました。

lsp2 系の命令において、X拡大率とY拡大率の積が負の場合に画像が表示されないバグを修正しました。

transbtn を実装しました。transbtn 使用時にキーボードショートカットによってボタンの選択ができるように、マウスカーソルによるボタンの選択状態を判定する際に、ボタンの矩形領域の一番左上の1画素は常に可視であるとして処理しています。

1月29日

Android 版において、Home キーを押して処理をバックグラウンドに移したときに、音量が0になるようにしました。

1月11日

画像ファイルや音楽ファイルを読み込む際に new(std::nothrow) を使い、NULL が返ってきた場合には読み込みを中止して続行するようにしました。突然落ちることが少なくなるかもしれません。

コードを整理しました。

1月10日

画面の描画に関して、更新する領域のバウンディングボックス全体を常に描画するように変更しました。これまでは、個々の更新領域の面積の総和がバウンディングボックスの面積よりも小さい場合には個別に更新していましたが、描画処理(フレームバッファへの画像転送)に時間がかかるプラットフォームではかえって遅くなっていました。

入力待ちをクリックで飛ばしたときに、瞬間表示がテキスト終端で止まらないバグを修正しました。

コードを整理しました。

1月8日

バグ報告「 rndについて」を元に、Windows (Visual Studio 2008 C++) などにおいて、一回目の rnd の結果が毎回ほぼ同じ値になる問題を回避しました。乱数のシード値に time(NULL) を使っていますが、どうも上記のコンパイラで用意された rand() では、シード値が近い値の場合に最初の乱数値も近い値になってしまうようです。そのため、乱数の系列を初期化した直後の最初の乱数値を捨てるようにしました。

[Backport] ONScripter-ENを参考に lsp2add, lsph2add, lsp2sub, lsph2sub を実装しました。

!w, wait がクリックで飛ばせるようになっていたため修正しました。もしかしたら、他のクリック待ち判定に悪影響が出ているかもしれません。

1月7日

バグ報告「 画面のサイズについて」に関連して、Android 版パッケージのゲーム選択 画面上部に disable rescale の有無を指定するチェックボックスを配置しま した。チェックをすると、アーカイブ内の画像の大きさを画面に合わせて自動 的に調整する機能が無効になります。

1月6日

バグ報告「 Zaurus で透過 PNG の表示がおかしい。」に関連して、Zaurus 版の関連 ライブラリパッケージ(20110105)に Ogg Vorbis 形式の音楽ファイルが再生さ れない問題があったため修正しました。

1月5日

アルファ値のない 24bit PNG を透過形式 a (アルファブレンド)で読み込む場合に、画像の右半分をマスク画像とするのではなく、本家と同じく画像全体を表示するようにしました。「onscripterでの画像表示」や「Zaurus での透過 PNG の表示がおかしい。」や「αブレンドのpng」が関連するバグ報告です。

Zaurus 版のライブラリパッケージ(20101229)の作成方法が間違っており、PNG 画像を読み込むことができなかったため、作り直しました。